2016-12-31 65 views
0

我一直在研究C#中的事件系統,所以我做了瞭解爲什麼你不能直接訪問事件的訂閱者。 (我開始與委託,通過匿名函數和lambda語句)。然後,在實現我的第一個系統時,我遇到了管理訂閱的問題。我在這裏非常綠。如何清除C#中某個特定事件處理程序的訂閱?

像往常一樣,Stackoverflow非常有幫助。 This question shows me how to make a function to clear all the subscribers.爲了我的目的,這將是足夠具體的(清除所有並根據需要分配新的)。

我該如何通知單個函數來清除幾個事件代表之一?

public delegate void AnEventHandler(object sender, EventArgs e); 

public class EventPublisher : 
{ 
    public event AnEventHandler GroupA; 
    public event AnEventHandler GroupB; 

    public void ClearSubscribers(AnEventHandler handlerToClear) 
    { 
     handlerToClear = null; 
    } 
} 

我以爲我可以寫這樣的,我的訂閱類可以簡單地做

(EventPublisher MyPublisher)

MyPublisher.ClearSubscribers(MyPublisher.GroupA); 

但可惜它告訴我只能使用與+ =或 - =運算符,這讓我感到很意外,因爲我認爲引用是可以接受的。

I also do intend to implement my own add() and remove() functions.事情就是它有同樣的問題:我需要6個事件處理程序。當然,我不需要編寫6個並行的無效函數和6個唯一的添加/刪除函數對?我的大腦思考繼承,但點不連接。

回答

-1

如果您可以負擔得起,將變量設置爲null將刪除它的變量,然後重新設置它。

否則你應該可以做到this way

+0

問題是如何編寫一個函數,可以從發佈類之外的幾個事件中選擇一個。 – JayMounes

+0

這並不回答問題。如果您繼續忽略本網站的規則,那麼獲得50評論無法獲得* Comment Everywhere *特權。有關更多信息,請參閱[答案]。 – IInspectable

+0

我想補充一點,我發現了幾個解決這個問題的方法。首先,你可以使用一個委託,它缺乏事件保護的問題。其次,你可以重寫事件的+ =和 - =運算符以防止需要這樣的函數(儘管這被認爲是不好的做法,因爲消費者可能不知道覆蓋)。第三,您可以爲每個需要此功能的事件在發佈類中編寫一個函數。這似乎應該是可能的,而問題純粹是學術問題。我改變了我的程序結構,所以沒有必要。 – JayMounes