本文共 1855 字,大约阅读时间需要 6 分钟。
提起事件,我们都不陌生,事件使类之间有了交互的能力。它是建立在委托基础上的。有了前面对委托的了解,相信读起事件来也不会太难了。关于事件,现成的好文章数不胜数,本不打算写了。不过问道有先后,各抒己见,也不为过。想了想,还是不偷懒了,最起码能逼自己动动手,多理解几分。
类通过维护一个已登记事件列表,当事件发生的时候可以通知已登记的方法。主要功能:
Ps:看到这几点的时候,总会不自觉地想起观察者模式。
举个简单的例子:现在有一个天气预报信息发布中心,并且有短信天气预报和电视台天气预报两个客户订阅了天气信息。当新的天气数据到达后,信息发布中心会发送通知,此时短信和电视台天气预报均可以做出相应的发布。
实现过程:
按照约定,该类应该继承自EventArgs类,并且类名形如***EventArgs。通常该类需要定义私有字段及相应的只读公共属性。
本例中委托类型为EventHandler<WeatherEventArgs>,泛型System.EventHandler的定义为:
因此,要求登记该事件的方法的形式为:
void MethodName(object sender,WeatherEventArgs e);
- 虽然事件定义为Public,但是产生的相应的委托字段为private。
- 生成了以add_和remove_开头的事件,这两个事件分别对应System.Delegate的静态方法Combine()和Remove。这些在 委托 那一节已经提到过了。
- 事件定义记录项,主要包括一些标记和add,remove访问器方法,建立事件与访问器的关系。它的IL部分代码如下:
首先以电视台播报类为例:
现在我们再添加一个功能:查看订阅天气信息的客户,以及他们要触发的方法。
我这里没有使用反射之类的,而是简单利用了Delegate的GetInvocationList()方法,它对应着委托链的信息。有更好的建议也可以提出来分享。public void GetEventDetail()
{ Delegate[] ds = UpdateWeather.GetInvocationList(); Console.WriteLine("注册客户名单:"); for (int i = 0; i < ds.Length;i++ ) { Console.WriteLine("第"+i+"个客户:"+ds[i].Target.ToString()); Console.WriteLine(",调用方法" + ds[i].Method); Console.WriteLine(); } }
修改调用
感谢 的支持和建议。
关于事件就和大家分享这么多了,又是一个Happy Ending。
本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/archive/2011/09/08/2170968.html,如需转载请自行联系原作者