2008-11-13 93 views

回答

10

如果您在窗體本身的工作,你應該能夠做這樣的事情:

僞代碼:

Delegate[] events = Form1.SomeEvent.GetInvokationList(); 

foreach (Delegate d in events) 
{ 
    Form1.SomeEvent -= d; 
} 

從形式,您SOL之外。

+6

我,你就可以訪問該變量,只需將其設置爲空 - 沒有必要去通過調用列表... – 2008-11-13 17:58:01

7

如果您知道這些處理程序是什麼,只需以與訂閱它們相同的方式刪除它們,除非使用 - =而不是+ =。

如果你不知道處理程序是什麼,你不能刪除它們 - 這個想法是事件封裝可以防止一個感興趣的團體在觀察事件時阻止另一個類的興趣。

編輯:我一直假設你正在討論由不同的類實現的事件,例如,一個控件。如果您的課程「擁有」該事件,那麼只需將相關變量設置爲空。

2

我意識到這個問題相當古老,但希望它能幫助別人。您可以反省任何類的註銷所有事件處理程序。

public static void UnregisterAllEvents(object objectWithEvents) 
{ 
    Type theType = objectWithEvents.GetType(); 

    //Even though the events are public, the FieldInfo associated with them is private 
    foreach (System.Reflection.FieldInfo field in theType.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)) 
    { 
     //eventInfo will be null if this is a normal field and not an event. 
     System.Reflection.EventInfo eventInfo = theType.GetEvent(field.Name); 
     if (eventInfo != null) 
     { 
      MulticastDelegate multicastDelegate = field.GetValue(objectWithEvents) as MulticastDelegate; 
      if (multicastDelegate != null) 
      { 
       foreach (Delegate _delegate in multicastDelegate.GetInvocationList()) 
       { 
        eventInfo.RemoveEventHandler(objectWithEvents, _delegate); 
       } 
      } 
     } 
    } 
} 
相關問題