2010-03-26 51 views
4

刪除事件是有可能的,而不是這樣做:不知道他們的名字

person.Walking -= person_Walking1; 
person.Walking -= person_Walking2; 
person.Walking -= person_Walking3; 

這樣做:

person.Walking = // remove all the handlers without knowing their names 

感謝。

回答

4

編號事件的一部分是他們阻止你這樣做。如果我訂閱了按鈕點擊並訂閱了按鈕點擊,您有什麼權利刪除我的處理程序? (好吧,這有些擬人化,但你明白了。)請注意,這不是知道事件處理程序的「名稱」的問題 - 必須能夠提供對「相等」委託實例的引用。

例如,如果您訂閱使用匿名方法或lambda表達式的事件,你必須參考保持到某處:

EventHandler handler = (sender, args) => Console.WriteLine("Clicked!"); 
button.Click += handler; 
... 
button.Click -= handler; 

當您使用方法的名稱,這與該方法的名稱進行方法組轉換到委託實例:

button.Click += HandleEvent; 
... 
button.Click -= HandleEvent; 

這裏有涉及到兩個單獨的委託實例,但它們相等,因爲它們具有相同的調用列表(他們這樣做同樣的事情),他們有相同的目標(他們正在「同一個對象上」這樣做)。

編輯:我假設你只有有權訪問它作爲一個事件,而不是字段 - 如果你在發佈事件的類中編寫代碼,你可以做你喜歡的,並設置該字段爲空(或從集合中刪除它,或者您的實現工作)是沒有問題的。

+0

是的,訪問是一個事件。我想我必須找到一個不同的解決方案。 – Carlo 2010-03-26 23:14:18

+1

Jon Skeet的事件處理程序沒有人更好! – Pierreten 2010-03-26 23:14:49

+0

我喜歡這個解決方案,但在這個項目的這個階段是不可行的,有很多地方我們正在努力做到這一點,並且實施這個和測試過於耗時。這就是爲什麼我想要像清除一行中的所有事件一樣簡單的事情。 – Carlo 2010-03-26 23:23:10

2

當然。剛剛設置:

person.Walking = null;
+0

這是假設你在發佈事件的類中編寫代碼。 – 2010-03-26 23:13:37

+0

確實如此。我應該澄清,這只是一種內部能力。 – 2010-03-26 23:19:18

0

不是來自定義事件的課程外部。如果你真的想,你可以定義這樣的方法:

public void ClearEventListeners() { 
    MyEvent.Clear(); 
} 

(確切的通話可能會有所不同,如果它存在,但智能感知應該指向你在正確的方向)

+0

我已經試過這個,但是在這種情況下它不起作用,因爲即使那個具有事件的類也不能訪問這些處理程序。謝謝。 – Carlo 2010-03-26 23:14:51

+0

這值得一試! :) – 2010-03-26 23:37:51

1

這是事件發明的原因之一。如果你想這樣做,使用代表。

相關問題