也谈事件(Event)
最近园子里发表了一些讨论“事件(Event)”的文章,我也来凑个热闹,谈谈我对事件的一些粗浅的认识。本文不谈设计模式(观察者模式),只从运行时的角度来分析事件这个对象到底是个什么东西,它有那么神秘吗?为了更好的分析事件,本文将会编写一些例子来模拟事件的订阅机制。本文对事件的分析可以概括为下面三句话:
一、Delegate = Object + MethodInfo其实你完全可以通过Reflector这样的工具来看Delegate类型是如何定义的。在这里,我们只关注Delegate本质的东西,即Delegate最终是如果执行的。为此,我创建了下面一个简单的MyDelegate类型来模拟Delegate。 1: public class MyDelegate 3:? 5: public MethodInfo Method { get; private set; } 7: public MyDelegate(object target,MethodInfo method) 9: this.Target = target;
11: } 13: virtual void Invoke(params object[] args) 15: this.Method.Invoke(this.Target,args); 17: } 从上面的定义可以看到,MyDelegate只有两个属性:Object类型的Target和MethodInfo类型的Method。委托的执行通过需方法Invoke完成,具体来说,最终的执行通过反射的方式调用Method的Invoke方法完成。 二、MulticastDelegate对象多个Delegate对象的链表其实我们平时讲的委托,并不是一个单个的Delegate对象,实际上是一个委托链,这样一个委托链通过MulticastDelegate定义。由于定义也相对复杂,我们同样通过定义模拟类型来反映其本质的东西。为此,我创建了如下一个MyMulticastDelegate类型。 2: { 4:? 7: { } 9: override 10: { 12: if (null != Next) 14: this.Next.Invoke(args);
16: } class MyEventHandler : MyMulticastDelegate void Fire(object sender,EventArgs args)
10: } 12: static MyEventHandler operator +(MyEventHandler current,MyEventHandler next) 14: null == current)
16: return next;
18:? 20: while (null != terminator.Next) 22: terminator = terminator.Next; 24:? 26: return current;
28:? 30: { 32: } class Button public MyEventHandler Click { get; set; } 6: public Button(string id) 8: this.Id = id;
10:? 12: { 14: { 17: } 20: { 22: } class Foo 5: Button btn = sender as Button;
7: { 9: } class Program 4: { 6: var foo = new Foo();
8: btn1.Click += new EventHandler(foo.DoSomethingOnceClick);
14: } Click Button1 Click Button1 Click Button1 本文提供的例子,你可以通过这里下载,关于事件相关的内容,我还有一篇相关的文章《如何编写没有Try/Catch的程序》,仅供参考。 作者:Artech
出处:http://artech.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在我的新ASP.NET网站中使用OpenID?
- .net – IAuthenticationFilter.OnAuthenticationChallenge
- asp.net-mvc – 有条件地在webgrid中显示图像 – mvc 3
- asp.net-mvc – ASP.NET MVC 5模型绑定编辑视图
- asp.net-mvc – 使用viewbag传递模型进行查看
- asp.net – 为什么<%=%>在一种情况下工作,但在另一种情
- nuget-package – 如何在asp.net 5应用程序中添加项目引用
- asp.net-web-api – 带有OWIN OAuth承载令牌的Web Api 2
- asp.net – VB.NET – 如何使用Active Directory将SID转换为
- asp.net – URL重写出站规则IIS7
- Asp.net Mvc表单验证气泡提示效果
- asp.net-mvc – 在局部视图中Model为null
- asp.net – 访问网站根目录时,FormsAuthenticati
- asp.net – ASP和’不起作用
- asp.net – 当HTTPContext .Current为Nothing时如
- entity-framework – 管理dbContext的生命周期
- asp.net html控件的File控件实现多文件上传实例分
- asp.net – app_offline替代方案
- asp.net-mvc – 具有长不存在的URL的ASP.NET MVC
- asp.net-mvc – DisplayFor和ValueFor之间的区别