C#中通过反射、委托、多线程
C#中通过反射、委托、多线程
-
委托
声明委托:delegate如:public delegate int MyDelegate (string s);
实例化委托:public delegate void printString(string s);//定义委托
printString ps1 = new printString(WriteToScreen);//声明委托
委托的多播:委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。 -
C# this.Invoke()的作用与用法
Invoke()的作用是:在应用程序的主线程上执行指定的委托。一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke();
例子:
using System.Threading;
namespace test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
①//更新窗体中的TextBox1显示内容的方法
public void UpdateForm(string param1,string parm2)
{
this.textBox1.Text = param1+parm2;
}
②//声明委托
public delegate void UpdateForm_dl(string str1, string str2);
③//调用委托
private void Calldelegate()
{
/*在Windows窗体应用程序中使用this.Invoke 在WPF应用程序中使用this.Dispatcher.Invoke*/
this.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
//this.Dispatcher.BeginInvoke(new UpdateForm_dl(UpdateForm), new object[] { "我是文本框", "haha" });
}
④//创建新线程
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWork));
thread.Start();
}
⑤//新线程入口
public void DoWork()
{
Calldelegate();
}
}
}
- C#中通过反射调用委托
委托其实是个字段,要用GetField来获取;
先拿到字段对应的对象,然后拿到该对象对应的Invoke方法进行反射调用;
调用的时候记得传入字段对应的对象;
class ReflectionDelegateTest
{
public static void Main()
{
//首先将方法绑定到委托上
action += Run;
//首先获取委托所在类的Type
System.Type type = typeof(ReflectionDelegateTest);
//***因为委托实际上是字段,所以这里要用GetField来查找到它的信息***
System.Reflection.FieldInfo actionField = type.GetField("action", BindingFlags.Public | BindingFlags.Static);
//***通过字段信息获取到字段对应的值***
object actionObject = actionField.GetValue(null);
//***通过字段值获取到Invoke方法的元数据***
System.Reflection.MethodInfo handlerMethod = actionObject.GetType().GetMethod("Invoke");
//现在可以反射调用委托了,记得传入字段对应的值对象
handlerMethod.Invoke(actionObject, new object[] { "Call By Reflection!" });
System.Console.ReadKey();
}
/// <summary>
/// 泛型委托
/// </summary>
public static System.Action<string> action;
public static void Run(string msg)
{
System.Console.WriteLine(msg);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程