【原创】C#深入剖析(1)——事件
C#深入剖析(1)——事件
准备写一个系列文章,深入探讨C#及.Net中的某些特性。
第一篇 事件
事件相信每个人都不陌生,随便一个WinForm程序,就会使用大量的事件,比如:
class MainForm : Form { public MainForm() { this.Click += new EventHandler(MainForm_Click); } private void MainForm_Click(object sender, EventArgs e) { }}
event MethodInvoker OneEvent;
event MethodInvoker OneEvent { add { } remove { } }其中MethodInvoker
private MethodInvoker OneEvnet;
class Demo { public void InvokeEvent() { if (OneEvent != null) OneEvent();//调用事件 if (TwoEvent != null) { string str = TwoEvent(217);//调用事件 MessageBox.Show(str); } } public event MethodInvoker OneEvent; public event Func<int, string> TwoEvent;} private void button1_Click(object sender, EventArgs e) { Demo de = new Demo(); de.OneEvent += delegate { MessageBox.Show("事件被调用"); }; de.TwoEvent += arg => arg.ToString(); de.InvokeEvent(); }
class Demo { public void InvokeEvent() { if(ehl[oneEvent]!=null) ehl[oneEvent].DynamicInvoke();//调用事件 if (ehl[twoEvent] != null) { string str = ehl[twoEvent].DynamicInvoke(217) as string;//调用事件 MessageBox.Show(str); } } EventHandlerList ehl = new EventHandlerList(); static readonly object oneEvent = new object(); static readonly object twoEvent = new object(); public event MethodInvoker OneEvent { //在add和remove访问器中,类似属性,存在一个value,表示要订阅和取消的委托 add { //我这里的条件没有什么实际意义,只是想说明可以在访问器中执行代码 //示例中,起到一个筛选的作用,只有那些以”On”开头,并且定义于其他类中的方法才能被订阅 if (value.Method.Name.StartsWith("On") && value.Target != this) ehl.AddHandler(oneEvent,value); } remove { //对不起,禁止你取消静态方法(为什么禁止取消静态方法?没有理由,只用于举例^-^) if (!value.Method.IsStatic) ehl.RemoveHandler(oneEvent,value); } } public event Func<int, string> TwoEvent { add { ehl.AddHandler(twoEvent,value); } remove { ehl.RemoveHandler(twoEvent,value); } } public void OnCall() { MessageBox.Show("Demo.OnCall"); } } class Pro { public void Call() { MessageBox.Show("Pro.Call"); } public void OnCall() { MessageBox.Show("Pro.OnCall"); } public static void OnCalls() { MessageBox.Show("Pro.Static.OnCalls"); }} private void button1_Click(object sender, EventArgs e) { Pro pr = new Pro(); Demo de = new Demo(); de.OneEvent += pr.Call;//不以”On”开头,不会订阅 de.OneEvent += pr.OnCall;//成功订阅 de.OneEvent += Pro.OnCalls;//成功订阅 de.OneEvent += de.OnCall;//只有定义在其他类中的方法才会被订阅 de.InvokeEvent(); de.OneEvent -= pr.Call;//未订阅,谈不上取消 de.OneEvent -= pr.OnCall;//成功取消 de.OneEvent -= Pro.OnCalls;//静态方法不会被取消 de.OneEvent -= de.OnCall; //未订阅,谈不上取消 de.InvokeEvent(); }
private void button1_Click(object sender, EventArgs e) { PropertyInfo pi= typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); EventHandlerList ehl = pi.GetValue(button2, null) as EventHandlerList; FieldInfo fi = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static); object key=fi.GetValue(null); Delegate del= ehl[key]; foreach (Delegate de in del.GetInvocationList()) { Console.WriteLine(de.Method.Name);//订阅的事件 ehl.RemoveHandler(key, de);//取消订阅 } }
[DefaultEvent("Click")] class Control {}
TypeDescriptor.GetDefaultEvent。
Attribute attr= Attribute.GetCustomAttribute(typeof(TreeView),typeof(DefaultEventAttribute));DefaultEventAttribute de = attr as DefaultEventAttribute;MessageBox.Show(de.Name);
[解决办法]
多谢分享
[解决办法]
帮顶 学习了 我预见这个好帖会火起来的.
[解决办法]
顶起来学习。
[解决办法]
学习,该恶补一下原理基础了。
[解决办法]
学习
收藏
转载
帮顶
[解决办法]
感谢分享
学习
[解决办法]
学习,恶补
[解决办法]
学习,再学习。
[解决办法]
mark
[解决办法]
UP
[解决办法]
mark
[解决办法]
支持,期待~
[解决办法]
感谢,学习
[解决办法]
不错,多谢楼主分享!
[解决办法]
多谢楼主给的学习机会
[解决办法]
支持
[解决办法]
此贴必顶
[解决办法]
学习
[解决办法]
帮顶。。学习一下!!!
[解决办法]
呵呵,好顶下啊
[解决办法]
UP~~
学习~~~
[解决办法]
學習咯.....
[解决办法]
抢代码抢分抢美女
[解决办法]
好,学习了
[解决办法]
呵呵,收藏了…楼主好像是要我们接分的…呵呵
[解决办法]
mark
[解决办法]
谢谢分享,继续发扬!
[解决办法]
帮顶。。学习一下!!!
[解决办法]
顶了
[解决办法]
多谢!!!!
[解决办法]
不错,继续!!!
[解决办法]
JF~~~~
[解决办法]
先顶后看。
[解决办法]
感谢 还要多学习啊
------解决方案--------------------
顶,支持一下
[解决办法]
感谢,支持!!
lz是好人!
[解决办法]
mark
[解决办法]
前面一直没看明白...后面终于碰到点熟悉的了...
[解决办法]
谢谢。帮顶
[解决办法]
顶!奉献精神!!
[解决办法]
很详细 顶
[解决办法]
学习了
[解决办法]
顶下~
[解决办法]
顶,要学习的
[解决办法]
学习。分不要了
[解决办法]
xue xi
[解决办法]
先来顶一下,这贴要入精华了...
[解决办法]
学习学习
[解决办法]
学习了
[解决办法]
回了再看。学习
[解决办法]
学习了
[解决办法]
多谢分享
[解决办法]
mark
[解决办法]
好好学习,写得很好
[解决办法]
学习。。
[解决办法]
thx
[解决办法]
很好
[解决办法]
Mark!
[解决办法]
UP
[解决办法]
学习了!
[解决办法]
楼主写的漂亮
[解决办法]
楼主你太伟大了,我怎么瞧着你像大海一样啊!
放心我不晕船,呵呵
好,支持楼主
[解决办法]
好贴
[解决办法]
写得很好,受益匪浅啊!谢谢。
[解决办法]
UP!
[解决办法]
up
[解决办法]
不错的东东,支持!
[解决办法]
好贴,自己写的还是抄书的?
舞蝶飞数码创意
.net开发的图像处理软件。
图片合成flash
图片合成ppt
图片合成avi视频
免费照片边框
[解决办法]
LZ的奉贤精神真是可贵~学习了
[解决办法]
接着收藏
[解决办法]
学习+收藏
[解决办法]
ding
[解决办法]
好
[解决办法]
学习ing...
[解决办法]
好像是这样。。。。
[解决办法]
没看完,先Mark
[解决办法]
我要顶的更高~~~~~
[解决办法]
学习,顶起
[解决办法]
谢谢,非常感谢!!!
[解决办法]
学习,支持
[解决办法]
mark!!!!
[解决办法]
mark!!!!
[解决办法]
绝对火贴~~~ 支持~!
[解决办法]
学习了