博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过反射处理委托
阅读量:5793 次
发布时间:2019-06-18

本文共 1243 字,大约阅读时间需要 4 分钟。

hot3.png

首先要确定处理的是哪一种事件或者委托(这里选用常用的 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); }}

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

你可能感兴趣的文章
【致青春】我们挥霍时间的年代
查看>>
Windwos Server 2008 R2 DHCP服务
查看>>
SAS和SATA硬盘的区别
查看>>
现代程序设计 学生情况调查
查看>>
U盘安装linux后无法引导
查看>>
C# 矩阵作业
查看>>
俺的新书《Sencha Touch实战》终于出版了
查看>>
关于数据库查询时报“query block has incorrect number of result columns”
查看>>
li下的ul----多级列表
查看>>
UVa 11292 勇者斗恶龙(The Dragon of Loowater)
查看>>
线程退出时执行函数,处理资源
查看>>
java中关于时间的格式化
查看>>
Wine QQ2012 笔记
查看>>
qml demo分析(clocks-时钟)
查看>>
vue去掉#——History模式
查看>>
2018年7月第一周网站建站笔记
查看>>
MongoDB工具MagicMongoDBTool使用介绍(一) -- 简单MongoDB入门
查看>>
javascript的事件
查看>>
201521123009 《Java程序设计》第1周学习总结
查看>>
年终述职--常见问题分析解答
查看>>