2016-03-18 104 views
7

假設我們有一個委託如何刪除所有的事件處理程序

public delegate void MyEventHandler(string x); 

和事件處理程序

public event MyEventHandler Something; 

我們添加多個事件..

for(int x = 0; x <10; x++) 
{ 
    this.Something += HandleSomething; 
} 

我的問題是..如果一個人不知道它被添加了10次(或更多或更少)次,那麼如何從事件處理程序中刪除所有方法?

回答

17

的情況下簡單地設置null

this.Something = null; 

這將註銷所有的事件處理程序。

+0

我一直以爲一個人不得不手動刪除它們,但令人驚訝的是..這確實工作..我做了類似於http://stackoverflow.com/questions/447821/how-doi-i-取消訂閱所有處理程序從一個事件爲特殊類在C – Eminem

+0

在我看來,這種做法是值得做一個類的Dispose(布爾)方法,但我沒有請參閱任何地方的此練習參考。我的想法是什麼? –

+1

我認爲這可能是一個好主意,但你應該小心,不要臃腫你的代碼,這可能最終導致錯誤,而不是修復它們。我有一個方法,我通過註冊和取消註冊操作,並調用「Dispose」它執行所有註銷操作。 @PieterGeerkens –

0

作爲僞想法:

C#5 <

class MyDelegateHelperClass{ 
    public static void RemoveEventHandlers<TModel, TItem>(MulticastDelegate m, Expression<Func<TModel, TItem>> expr) { 


       EventInfo eventInfo= ((MemberExpression)expr.Body).Member as EventInfo; 


       Delegate[] subscribers = m.GetInvocationList(); 

       Delegate currentDelegate; 

       for (int i = 0; i < subscribers.Length; i++) { 

        currentDelegate=subscribers[i]; 
        eventInfo.RemoveEventHandler(currentDelegate.Target,currentDelegate); 

       } 
      } 
} 

用法:

MyDelegateHelperClass.RemoveEventHandlers(MyDelegate,()=>myClass.myDelegate); 

C#6

public static void RemoveEventHandlers(this MulticastDelegate m){ 

     string eventName=nameof(m); 

     EventInfo eventInfo=m.GetType().ReflectingType.GetEvent(eventName,BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); 


     Delegate[] subscribers = m.GetInvocationList(); 

     Delegate currentDelegate; 

     for (int i = 0; i < subscribers.Length; i++) { 

      currentDelegate=subscribers[i]; 
      eventInfo.RemoveEventHandler(currentDelegate.Target,currentDelegate); 

     } 

    } 

用法:

MyDelegate.RemoveEventHandlers(); 
相關問題