概述
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); } } } }
转载于:https://www.cnblogs.com/y112102/p/3878551.html
最后
以上就是无语小甜瓜为你收集整理的取消事件所有委托方法的全部内容,希望文章能够帮你解决取消事件所有委托方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复