C#中通过反射、委托、多线程

C#中通过反射、委托、多线程

  1. 委托
    声明委托:delegate 如:public delegate int MyDelegate (string s);
    实例化委托:public delegate void printString(string s);//定义委托
    printString ps1 = new printString(WriteToScreen);//声明委托
    委托的多播:委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

  2. 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();
  }
  }
}
  1. 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);
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅里雪山GIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值