首页 > 代码库 > 取消事件所有委托方法
取消事件所有委托方法
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); } } }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。