通过反射处理委托

首先要确定处理的是哪一种事件或者委托(这里选用常用的 Click 事件)

FieldInfo fieldInfo = (typeof(Control)).GetField

("EventClick", BindingFlags.Static | BindingFlags.NonPublic);

然后获取事件列表 (这里使用的 Button )

 EventHandlerList buttonEvents = (EventHandlerList)this.button1.GetType().InvokeMember("Events",
System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Instance |
 System.Reflection.BindingFlags.NonPublic
                , null, this.button1, null);

拆开写成俩行或许更容易看

PropertyInfo propertyInfo = (typeof(System.Windows.Forms.Button)).GetProperty("Events",
 BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(button1, null);

可以通过反射从对象中获取所需的属性信息。这里就是 从 Button控件中获取事件的信息,事件的属性列表中键值为 “Events”,然后拆箱为 EventHandlerList 对象。

然后从事件列表中获取全部的属于我们处理的事件类型的委托。

// 得到 EventClick 事件的键值表示
object eventKey = fieldInfo.GetValue(null);

// 得到所有事件

Delegate d = eventHandlerList[eventKey];

下面就是可以通过循环来处理了

if (d != null)
{
 foreach (Delegate temp in d.GetInvocationList())
 {
  Console.WriteLine(temp.Method.Name);
  //这个地方可以清除所有的委托,也可以使用条件清除指定委托,没有办法直接清除所有的

  richTextBox1.AppendText(temp.Method.Name + "\n");
  // 清理委托
  eventHandlerList.RemoveHandler(eventKey, temp);
 }
}

CodeDemo

转载于:https://my.oschina.net/HenuToater/blog/352380

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值