none
C# 如何撤销事件绑定的匿名委托? RRS feed

  • 问题

  • 我首先在某个操作中注册了事件:ProjectService.OnLoaded += (object, events) => {......};

    在第二个操作中我需要取消这个事件,那我该如何实现?


    hello world
    2010年10月29日 2:05

答案

  • 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);
      }
    }
    • 已标记为答案 leeTobill 2010年10月29日 9:40
    2010年10月29日 5:07
  • 我首先在某个操作中注册了事件:ProjectService.OnLoaded += (object, events) => {......};

    在第二个操作中我需要取消这个事件,那我该如何实现?


    hello world

     

    dear

    取消注册用: -=

    ProjectService.OnLoaded -= (object, events) => {......};


    秘訣無它,唯勤而已
    • 已标记为答案 leeTobill 2010年10月29日 9:41
    2010年10月29日 6:14

全部回复

  • 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);
      }
    }
    • 已标记为答案 leeTobill 2010年10月29日 9:40
    2010年10月29日 5:07
  • define (object, events) => {......} ;有名字的方法 为delegatename,而非匿名的。 ProjectService.OnLoaded -=  delegatename;
    2010年10月29日 6:08
  • 我首先在某个操作中注册了事件:ProjectService.OnLoaded += (object, events) => {......};

    在第二个操作中我需要取消这个事件,那我该如何实现?


    hello world

     

    dear

    取消注册用: -=

    ProjectService.OnLoaded -= (object, events) => {......};


    秘訣無它,唯勤而已
    • 已标记为答案 leeTobill 2010年10月29日 9:41
    2010年10月29日 6:14