一个事件,比如是button1.Click事件
一般情况下,我们会知道绑定了什么事件处理程序,比如button1_Click方法,那么我们就可以用-=运算符移除事件处理程序但如果不知道这个事件上绑定了什么方法(比如匿名方法),也不知道绑定了多少个方法,怎么清除这些方法?使得button1.Click事件不执行任何操作?

解决方案 »

  1.   

      你要能得到定义这个事件的委托就行,用委托的Method属性获取挂在委托上的所有方法然后 恩恩
      

  2.   


                Type t = button1.GetType();
                PropertyInfo pi = t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
                EventHandlerList ehl = (EventHandlerList)pi.GetValue(button1, null);
                FieldInfo fieldInfo = (typeof(Control)).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic);
                Delegate d = ehl[fieldInfo.GetValue(null)];
                if (d != null)
                {
                    foreach (Delegate temp in d.GetInvocationList())
                    {
                        ehl.RemoveHandler(fieldInfo.GetValue(null), temp);
                    }
                }
      

  3.   

    楼上强。
    再问下,Delegate或MultiDelegate能解决问题吗?
      

  4.   

    3楼的不行啊。你的是winform下的还是asp.net?我在asp.net下不好用啊(2005)
      

  5.   

    只能用反射来解决吗?
    Delegate这个类不行啊?
      

  6.   

    fieldInfo.GetValue(null)得到的是什么?
    跟Delegate.Target不一样啊
    我调用GetType(),居然是object