zoukankan      html  css  js  c++  java
  • 通过反射清除事件订阅

    针对Winform,网上介绍的都语焉不详,或者根本不能用,因此研究了一下,贴出来以备参考。

    如果你用的自定义类,那么可能事件的处理会有差异,请勿参考下文。后期遇到需要再研究。

    记录不易,转载请注明出处。

     https://www.cnblogs.com/honk/p/12776589.html

    主要用到的是:EventInfo.RemoveEventHandler

    也可以使用:System.ComponentModel.EventHandlerList.RemoveHandler

    具体代码参考如下:

                //取控件指定 EventInfo
                EventInfo evt = splitButton1.GetType().GetEvent("Click");
                if (evt!=null)
                {
                    //取继承的Events属性信息,此属性继承自:System.ComponentModel.Component.Events  (System.ComponentModel.EventHandlerList)
                    var li = splitButton1.GetType().GetProperty("Events", BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
                    if (li != null)
                    {
                        //从属性对象中取出实例的事件列表集合
                        System.ComponentModel.EventHandlerList list = (System.ComponentModel.EventHandlerList)li.GetValue(splitButton1, null);
    
                        //从事件列表中取出对应Key的事件信息
                        //这里可以从Control.Click反编译代码中可以看到:
                        //public event EventHandler Click
                        //{
                        //    add { this.AddHandler("Click", value); }
                        //    remove { this.RemoveHandler("Click", value); }
                        //}
                        Delegate d = list["Click"];
    
                        //方法1:直接从EventInfo解除订阅
                        evt.RemoveEventHandler(splitButton1, d);
    
                        //方法2:通过事件列表来清除所有订阅
                        if (d != null)
                        {
                            foreach (Delegate temp in d.GetInvocationList())
                            {
                                list.RemoveHandler("Click", temp);
                            }
                        }
                    }
                }
  • 相关阅读:
    一个简单的空间配置器
    【转】c++中placement new操作符
    类的operator new与operator delete的重载【转】
    STL中常用的c++语法
    java编程思想-多态
    java编程思想-复用类(2)
    java编程思想-复用类
    import与require的区别
    gulp插件
    gulp-gulpfile.js语法说明
  • 原文地址:https://www.cnblogs.com/honk/p/12776589.html
Copyright © 2011-2022 走看看