c#如何使用反射去创建一个委托_通过对象方法获取委托_C#反射获取委托_

  • Post author:
  • Post category:其他


前言:时间紧,先写关键代码,以后优化:

在此感谢其他博友分享的文章,参考文章:C#反射委托创建器

1-定义含有委托的类:

public classTimeCycle

{///

///唯一标识///

public int ID { get; set; }///

///静态方法委托(只定义委托参数即可)///

public Action Action { get; set; }///

///实例方法委托(实例类型+定义委托参数)///

public Action Action2 { get; set; }

}

2-初始化类:

创建委托方法1–创建静态方法的委托,只需要2个参数:委托类型和方法信息:

Delegate.CreateDelegate(typeof(Action), myTipType.GetMethod(“SendTipsToDingding”))

创建委托方法2–创建实例方法的委托,需要2+1个参数:除了上面的委托类型和方法信息;还有,,,还有被委托方法对应的实例类型!!!

即:Action 类型必须改为含有实例类型的委托:Action,至于为什么?  应该是因为,非静态方法的委托调用需要实例依托在实例的基础上,只有实例才能权利调用实例方法。

所以,实例方法创建的委托必须得包含实例类型才能正常创建。

备注:创建委托失败常出现的一个错误,需要对委托的是否静态方法和对应参数进行检查:

System.ArgumentException:“无法绑定到目标方法,因其签名或安全透明度与委托类型的签名或安全透明度不兼容。”

public partial classMyTipsService : ServiceBase

{public voidTest()

{

Type myTipType= typeof(MyTipsService);//创建静态方法委托1:

TimeCycle timeCycle1 = newTimeCycle

{

ID= 1,

Action= (Action)Delegate.CreateDelegate(typeof(Action), myTipType.GetMethod(“MyProjectBugTips”)),

};//创建实例方法委托2:

TimeCycle timeCycle2 = newTimeCycle

{

ID= 1,

Action2= (Action)Delegate.CreateDelegate(typeof(Action), myTipType.GetMethod(“SendTipsToDingding”)),

};var a = 1;

}#region 获取提醒消息

///

///每天上下班提醒///

public void SendTipsToDingding(TimeCycle timeCycle, stringtypeStr)

{

}///

///我的项目BUG的提醒///

public static void MyProjectBugTips(TimeCycle timeCycle, stringtypeStr)

{

}#endregion}



版权声明:本文为weixin_39886612原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。