从反射看委托与事件,委托真的是一个类,一点不假,呵呵
关于委托与事件,网上介绍得非常之多,在此不再赘述,本人最近需要捣鼓一些委托,因而对委托进行一定的寻根究底,故用反射把委托的成员揪出来,且看如下代码:
delegate void DelegateDemo(); static event DelegateDemo delHandle; static void Main() { delHandle += new DelegateDemo(MyDelegate_delHandle); MemberInfo[] mis = delHandle.GetType().GetMembers(); foreach (var item in mis) { Console.WriteLine(item.Name+" " + item.ToString()); } } static void MyDelegate_delHandle() { throw new NotImplementedException(); }
贴出来才发现是获取事件的类型,当然用此与委托进行对比的话只需要将delHandle.GetType()改为typeof(DelegateDemo),对比下会发现什么呢?好奇的童鞋自行试验了哈。
上述输出也许看的不是很直观,我们可以断点进去监视,看下图,显示得非常直观,可以看到其内部公共的成员方法和属性了啊。
另外说一点我的个人看法,委托是一个类,那么事件是什么呢?我认为事件就是类的一个对象,看这个反射获取类型的方式与平常反射一个类反射一个对象就是完全一致的呵。
关于委托,添加一点,这是以前未曾注意的:委托协变——支持返回值协变;逆变——支持参数, 但传参仍然以委托定义的参数为准
好了,以上是反射方式分析委托和事件,当然还有更底层的分析——IL,请看这篇园友猫行天下提供的博文http://www.cnblogs.com/slayercat/archive/2012/09/27/2705786.html