通过反射处理委托

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

时间: 2025-01-13 09:17:58

通过反射处理委托的相关文章

如何:使用反射将委托挂钩

如何:使用反射将委托挂钩 .NET Framework 4.5 其他版本 当使用反射来加载和运行程序集时,不能使用 C# += 运算符或 Visual Basic AddHandler 语句等语言功能将事件挂钩. 以下过程显示如何通过用反射获取所需的全部类型将现有方法挂钩到事件,以及如何使用反射发出来创建动态方法并将其挂钩到事件.  说明 有关事件处理委托的其他挂钩方式,请参见 EventInfo 类的 AddEventHandler 方法的代码示例. 使用反射挂钩委托 加载包含引发事件的类型的

用PHP的反射实现委托模式的讲解_php技巧 - PHP

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式本质上是在更特殊的场合采用了委托模式. 动态委托的介绍:动态委托概念来自于Jakarta 字节码工程库 (Byte-Code Engineering Library, BCEL).它能够分析存在的类,并且对于接口,抽象类

.NET委托解析

委托这个概念其实我们都很熟悉了,但是在使用的时候很多人还是无法去把控它,我们可以试想一下,在平时编码的时候,你是直接按照业务逻辑直接创建类,new出一个对象来进行操作的还是说有用到委托来更高效的完成一些功能.接下来博主将从委托最浅显的地方开始入手,中间插入对于委托源码的解析进行逐步加深巩固,简单来说,就是通过实例.概念.源码来最终通过本文的讲解能让我和阅读的您对于委托的理解提升一些.主题大概分为: 通过实例了解委托的概念 委托的回调 委托的深入(委托链 - 合并删除委托) 委托的源码解析 泛型委

泛型初了解

List<T>泛型只是泛型中的一种,很多地方都可以用到泛型,dictionary.list.反射.委托-- 泛型 程序设计语言的一种特性,使得程序员在强类型程序设计语言中可以定义一些可变的部分,这些可变的部分在使用前必须做出指明,泛型实际是具有占位符的类.结构.接口.和方法. 占位符:先占住一个固定的位置,等着你再往里面添加内容的符号 强类型语言:不同类型之间有严格的定义,只有相同的变量才能操作. 弱类型语言:没有明显的类型区别,各个类型之间可以自动的转换. 在三层中师父就要求不可以将D层的传

勿忘心安。

是该写些文字来一下提醒自己,现在时间2016年5月28日,一个毕业季,大学生活也已接近尾声,想想我现在拥有什么.  那么说说我现在在学校的一些情况,专业知识只能说一般,也并没有那么多的强项,我不是学霸,只是一个稍微努力的学生而已. PS,现在还是记得怎么使用的,会简单的P图,会给我家丫头去一些简单的水印.污点,还会制作一些简单的图:    HTML,会使用HTML的各类标签,会 写DIV+CSS的网页排版,会用CSS进行页面的样式的调节,也做过HTML的网页,<美淘网>,不算大型,几个小网页:

ASP.net 学习路线(详细)

ASP.net 学习路线(详细) 浏览:5632 | 更新:2013-12-13 16:33 | 标签: asp.net 百度经验:jingyan.baidu.com .net学习路线 入门篇1.         学习面向对象(OOP)的编程思想 许多高级语言都是面向对象的编程,.NET也不例外.如果您第一次接触面向对象的编程,就必须理解类.对象.字段.属性.方法和事件.封装.继承和多态性.重载.重写等概念.需要说明的是,微软的产品帮助文档做得非常完善,而且查询相当方便,入门者不得不看.安装完V

ASP.NET MVC Model验证学习—上

蒋大师的MVC框架解析确实是越学越有趣,即使是跟着学写些示例代码也是收获良多,尤其是关于类型.反射和委托等方面,平时在应用开发中确实很少会有机会写这样的代码.今天学习的ASP.NET MVC中的Model的验证,刚开时会以为这一章会比较简单,因为之前已经学习过了Model元数据的解析.Model绑定,Model的验证可能就只是DataAnnotation相关类的介绍.但实际学习的过程中,尤其是自定义用于修饰Action的验证特性让我到现在仍然感觉是比较萌萌哒,毕竟这一块对于框架的扩展基本上涉及到

获取Type对象实例的三种常用方式

平常在封装一些底层方法的时候,使用反射+泛型+委托,可以起到一个普遍适用的作用.今天要总结的是反射中一个非常重要的类--Tyep,平常我们用这个类的时候,都是通过它获取一个类型的属性,方法...然后进行各种操作. 下面是如何获取一个Type对象实例的一般方法: 首先,为了做个demo,我们先来写个简单的类: //人 public class People { public string ID { get; set; } public string Name { get; set; } } 然后用

设计模式(博客园精化集)

Web Client Software Factory系列(3):View-Presenter模式作者: TerryLee .NET设计模式(18):迭代器模式(Iterator Pattern)作者: TerryLee .NET设计模式(19):观察者模式(Observer Pattern)作者: TerryLee .NET设计模式(2):单件模式(Singleton Pattern)作者: TerryLee .NET设计模式(3):抽象工厂模式(Abstract Factory)作者: Te