• 取消事件所有委托方法


    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);
                }
            }
        }
    }
  • 相关阅读:
    Golang-数据类型-int类型
    Golang基础知识-变量
    16.和input相关的知识点
    14.ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
    12.登录页面左右切换。
    10.用js下载文件(需要后端链接)
    9.用js制作静态分页
    8.一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
    7.前端性能优化的方法
    iOS
  • 原文地址:https://www.cnblogs.com/y112102/p/3878551.html
Copyright © 2020-2023  润新知