zoukankan      html  css  js  c++  java
  • 取消事件所有委托方法

    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);
                }
            }
        }
    }
  • 相关阅读:
    VB中String的用法及原理
    SQL中的left outer join,inner join,right outer join用法详解
    SqlServer,Oracle 常用函数比较
    sql 使用视图的好处
    修改数据库的兼容级别
    sql server2008修改登录名下的默认架构名
    SQL事务回滚 ADO BeginTrans, CommitTran 以及 RollbackTrans 方法
    sql事务(Transaction)用法介绍及回滚实例
    SQL Server更新表(用一张表的数据更新另一张表的数据)
    VB如何连接SQL Server数据库
  • 原文地址:https://www.cnblogs.com/y112102/p/3878551.html
Copyright © 2011-2022 走看看