取消事件所有委托方法
2014-07-30 17:17
393 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.ComponentModel; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ProtocolEvent c = new ProtocolEvent(); c.OnChange += new ProtocolEvent.mydelegate(c_OnChange); c.OnChange += new ProtocolEvent.mydelegate(c_OnChange2); RemoveEvent<ProtocolEvent>(c, "OnChange"); c.OnChange += new ProtocolEvent.mydelegate(c_OnChange); c.Change("ddd"); } static void c_OnChange(string str) { Console.WriteLine(str); } static void c_OnChange2(string str) { Console.WriteLine(str); } static void RemoveEvent<T>(T c, string name) { Delegate[] invokeList = GetObjectEventList(c, name); if (invokeList == null) return; foreach (Delegate del in invokeList) { typeof(T).GetEvent(name).RemoveEventHandler(c, del); } } /// <summary> /// 说来很简单,GetType().GetField("事件名",BindingFlags.Instance | BindingFlags.NonPublic); /// 然后调用GetValue就可以得到对应的委托了。既然有委托了。调用GetInvokeList就可以了。 public static Delegate[] GetObjectEventList(object p_Object, string p_EventName) { FieldInfo fi = p_Object.GetType().GetField("OnChange", BindingFlags.Instance | BindingFlags.NonPublic); if (fi == null) return null; Delegate del = fi.GetValue(p_Object) as Delegate; if (del != null) { //执行方法 //foreach (var item in del.GetInvocationList()) //{ // Console.WriteLine(item.Method.ToString()); // item.Method.Invoke(null,new object[]{"str"}); //} return del.GetInvocationList(); } return null; } } class ProtocolEvent { public delegate void mydelegate(string str); public event mydelegate OnChange; public void Change(string str) { if (OnChange != null) { OnChange(str); } } } }
相关文章推荐
- C# 委托事件的另类取消方法
- 清除事件所有委托方法
- 委托事件的另类取消方法
- C#中的委托和事件(2) ---将方法绑定到委托
- 取消Windows 2008中关机时弹出的“关闭事件跟踪程序”方法
- preventDefault() 方法 取消掉与事件关联的默认动作
- 关于委托、事件、处理事件的方法以及.NET
- C#多线程-不同线程之间通过事件委托封送调用方法
- Delegate,Action,Func,匿名方法,匿名委托,事件
- 温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件
- C#多线程-不同线程之间通过事件委托封送调用方法
- png透明部分取消点击&后边的控件事件不阻止的方法
- 在.NET2.0中如何更简单的使用委托将方法加载到事件中去
- Delegate,Action,Func,匿名方法,匿名委托,事件
- 学习笔记---对委托、匿名方法、Lama表达式及事件的理解
- 如何动态清理一个控件事件上附加的所有方法
- 委托、匿名方法、事件学习小结
- C# 委托 事件 匿名方法
- 统一的为对象添加多播事件委托的方法
- 事件与委托的匿名方法使用方法示例