首页
关于
Search
1
C语言中的类型衰变
181 阅读
2
C#对接chatgpt
173 阅读
3
winform中combobox绑定数据源
164 阅读
4
反射异步调用
122 阅读
5
dynamic在反序列化中的用途
122 阅读
技术分享
后端分享
前端分享
福利活动
资源分享
天天向上
登录
/
注册
Search
标签搜索
C#
.NET
DotNet
异步
Sqlserver
Mysql
axios
vue
Javascript
RabbitMQ
反射
反序列化
dynamic
c
winform
ChatGpt
Stream
SSE
西街长安
累计撰写
13
篇文章
累计收到
45
条评论
首页
栏目
技术分享
后端分享
前端分享
福利活动
资源分享
天天向上
页面
关于
搜索到
11
篇与
的结果
2023-07-06
反射异步调用
在 C# 中,通过反射获取到的方法可以使用异步调用。以下是一种实现异步调用反射方法的示例代码:using System; using System.Reflection; using System.Threading.Tasks; public class Program { public static async Task Main() { // 获取方法所在的类型 Type type = typeof(MyClass); // 创建类型的实例 object instance = Activator.CreateInstance(type); // 获取方法信息 MethodInfo methodInfo = type.GetMethod("MyMethod"); // 检查方法是否可异步调用 if (methodInfo.ReturnType == typeof(Task)) { // 调用异步方法 Task task = (Task)methodInfo.Invoke(instance, null); // 等待异步方法完成 await task; } else if (methodInfo.ReturnType.IsGenericType && methodInfo.ReturnType.GetGenericTypeDefinition() == typeof(Task<>)) { // 调用异步方法 dynamic task = methodInfo.Invoke(instance, null); // 等待异步方法完成并获取结果 dynamic result = await task; // 使用结果 Console.WriteLine(result); } } } public class MyClass { public async Task MyMethod() { // 异步方法的实现 await Task.Delay(1000); Console.WriteLine("Async method completed."); } }在上面的示例中,我们通过反射获取到了名为 "MyMethod" 的方法,并判断其返回类型来确定它是否为异步方法。如果返回类型是 Task,则使用 (Task)methodInfo.Invoke(instance, null) 异步调用方法并等待其完成。如果返回类型是泛型类型 Task<T>,则使用 dynamic 类型来调用异步方法并等待其完成,并获取到结果后进行处理。请注意,如果你要使用异步方法的返回值,需要在调用异步方法之前使用 await 关键字等待异步方法完成,并根据需要处理异步方法的返回值。
2023年07月06日
122 阅读
0 评论
0 点赞
2023-07-03
dynamic在反序列化中的用途
当嵌套的JSON结构过多并且需要创建大量的对象时,可以使用 dynamic 类型来解决这个问题。dynamic 类型是C#中的一种动态类型,它允许您在运行时动态地解析和访问属性和方法,而无需提前定义具体的类型。以下是使用 dynamic 类型进行反序列化的示例:string json = "{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\"},\"tags\":[\"tag1\",\"tag2\",\"tag3\"]}"; dynamic data = JsonConvert.DeserializeObject(json); string name = data.name; int age = data.age; string street = data.address.street; string city = data.address.city; List<string> tags = data.tags.ToObject<List<string>>(); 在上述示例中,我们将 JSON 文本解析为 dynamic 类型的对象 data。使用 dynamic 类型可以在运行时动态访问属性和值,无需提前定义类结构。注意,我们通过 data.address.street 和 data.address.city 来访问嵌套的属性。对于 tags 属性,我们使用 ToObject<List<string>>() 将其转换为 List<string> 类型。使用 dynamic 和 JObject,你可以更灵活地处理多层嵌套的 JSON 数据,而无需提前定义大量的类结构。然而,需要注意的是,在使用 dynamic 类型时,编译器无法提供类型检查,因此需要确保访问属性和值时的正确性和安全性。
2023年07月03日
122 阅读
0 评论
1 点赞
2023-06-23
C语言中的类型衰变
类型衰变(type decay)是指在特定情况下,数组作为函数参数传递时会自动转换为指向数组首个元素的指针类型。在C语言中,当你将数组作为函数参数传递时,数组的名称会自动转换为指向数组首个元素的指针。这意味着在函数内部,你将看到一个指针,而不是原始的数组。这种转换称为类型衰变。类型衰变的情况包括:将数组作为函数参数传递。将数组赋值给指针变量。将数组作为表达式的一部分参与运算。例如,考虑以下代码片段:void printArray(int arr[], int size) { // 函数内部使用指针访问数组 for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } } int main() { int myArray[] = {1, 2, 3, 4, 5}; // 将数组作为参数传递给函数 printArray(myArray, 5); // 数组赋值给指针变量 int* ptr = myArray; // 数组作为表达式的一部分 int value = *(myArray + 2); return 0; }在上述示例中,myArray 数组在函数调用、赋值和表达式中都发生了类型衰变。在函数 printArray 中,arr 参数被自动转换为指向 myArray 首个元素的指针,而不是一个完整的数组。同样地,将 myArray 赋值给指针变量 ptr,以及在表达式 *(myArray + 2) 中使用数组,都会发生类型衰变。类型衰变的结果是,在函数内部或其他上下文中,你无法通过 sizeof 运算符获取数组的真实大小,因为此时数组已经被转换为指针类型。要想在函数中获取数组的大小,你需要将数组的大小作为额外的参数传递给函数。
2023年06月23日
181 阅读
1 评论
65 点赞
2023-06-01
winform中combobox绑定数据源
首先连接到数据库string sql = "server=localhost;integrated security=true;database=database"; SqlConnection con = new SqlConnection(sql); con.Open();执行sql语句SqlDataAdapter sda = new SqlDataAdapter("select * from table", con);获取DataTableDataSet set = new DataSet(); sda.Fill(set);//执行查询并将结果填充到 DataSet 中。 DataTable dt = set.Tables[0];//从 DataSet 中获取第一个数据表(通常是唯一的数据表)。将其存储在一个 DataTable 对象 dt 中。DataTable 是一个以表格形式存储数据的对象。绑定数据源comboBox1.DataSource = dt;//将 DataTable 对象 dt 分配给 comboBox1 控件的数据源。 comboBox1.DisplayMember = "dm";//设置 comboBox1 控件用于显示数据的列。在这里,我们指定列名为 "dm"。你需要将 "dm" 替换为你要在 comboBox1 中显示的实际列的名称。 comboBox1.ValueMember = "vm";//设置 comboBox1 控件用于表示每个项的值的列。在这里,我们指定列名为 "vm"。你需要将 "vm" 替换为你要在 comboBox1 中作为项值的实际列的名称如何查询选中项数据string value = comboBox1.SelectedValue.ToString();//这一行代码获取了选择项的值,并将其存储在 value 变量中。 string text = comboBox1.SelectedText.ToString();//这一行代码获取了选择项的文本,并将其存储在 text 变量中。{alert type="warning"}请注意,SelectedValue 属性表示选中项的实际值,而 SelectedText 属性表示选中项在控件中显示的文本。有时候,当你直接从数据库填充 ComboBox 控件时,SelectedText 属性可能不会返回正确的值,因为它主要用于用户手动输入的情况。所以,在处理数据库填充的情况下,通常更常用的是使用 SelectedValue 属性来获取选择项的值。{/alert}
2023年06月01日
164 阅读
2 评论
3 点赞
2023-05-31
C#对接chatgpt
获取OpenAI API密钥:首先,需要在OpenAI网站上注册并获取API密钥。这将允许通过API与ChatGPT进行通信。之后我们再创建几个类用于储存需要提交的数据。internal record class Message(string role,string content);internal class Data { public string model = "gpt-3.5-turbo"; public Message[] messages; public float temperature=0.7f; public bool stream = false;//此处是告诉chatgpt是否通过流返回数据,如果为true,则后面代码中的Reader.ReadToEnd()要修改为Reader.ReadLine() }发起HTTP请求:使用C#中的HttpClient类,可以发起HTTP POST请求来与OpenAI API进行通信。在请求标头中,需要设置Authorization标头,并在请求主体中提供必要的参数。using System.Text.Json; using System.Net.Http; using System.Text; using System.Net.Http.Headers; using System.Net.Http.Json; using Newtonsoft.Json; using System.Net; namespace ConsoleApp13 { internal class Program { static void Main(string[] args) { string key = "这里填你的Key"; string result = "";//这里是最后拿到的json数据 HttpWebRequest http = (HttpWebRequest)WebRequest.Create("https://api.openai.com/v1/chat/completions"); Data data = new Data() { messages=new Message[] {new Message("user","用c#写登录功能")} }; http.ContentType = "application/json"; http.Method = "POST"; http.Headers.Add("Authorization", $"Bearer {Key}"); byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data)); http.ContentLength = bytes.Length; using (Stream streamr = http.GetRequestStream()) { streamr.Write(bytes, 0, bytes.Length); } HttpWebResponse response = (HttpWebResponse)http.GetResponse(); Stream stream = response.GetResponseStream(); using (StreamReader reader = new StreamReader(stream)) { result = reader.ReadToEnd(); } } } }{alert type="info"}成功对接ChatGpt后可以利用Asp.Net写chatgpt接口。{/alert}{alert type="info"}另外需要注意的是,如果是通过流接收数据,使用httpclient时会在响应完成后返回所有数据,而不是逐字返回。{/alert}
2023年05月31日
173 阅读
1 评论
71 点赞
1
2
3