项目中有用到动态事件绑定【多种事件】,由于可触发多次绑定,所以想获取订阅列表来判断是否已绑定事件,从而避免问题!
查找相关资料得知Delegate的GetInvocationList方法可以获取委托的订阅列表。于是问题集中在怎么通过event转换成delegate.
通过以下方法可以获取Button Click事件的订阅列表:
PropertyInfo p = (typeof(Button)).GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
EventHandlerList fplist = p.GetValue(this.button1, null) as EventHandlerList;
FieldInfo f = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
object key = f.GetValue(this.button1);
Delegate d = fplist[key];
Delegate[] fps = d.GetInvocationList();
注:Winform中的控件不能直接通过实例的事件名称进行转换来获取。
此方法在Button中进行正常,但在TextChanged事件却一直获取不到,查找相关资料得到的结论是impossible, 如有实现者请不吝赐教,感谢不尽!
但是在自定义类中,可以运行的非常happy, 如果一定要这样获取订阅列表,可实现自定义TextBox控件,从而达到目的
综合项目实际情况,最后决定采用标志位的方法解决问题,为记录查找解决方案过程中发现的知识,特记录!