首页 > 代码库 > 取消事件所有委托方法

取消事件所有委托方法

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);            }        }    }}