我一直在研究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個唯一的添加/刪除函數對?我的大腦思考繼承,但點不連接。
問題是如何編寫一個函數,可以從發佈類之外的幾個事件中選擇一個。 – JayMounes
這並不回答問題。如果您繼續忽略本網站的規則,那麼獲得50評論無法獲得* Comment Everywhere *特權。有關更多信息,請參閱[答案]。 – IInspectable
我想補充一點,我發現了幾個解決這個問題的方法。首先,你可以使用一個委託,它缺乏事件保護的問題。其次,你可以重寫事件的+ =和 - =運算符以防止需要這樣的函數(儘管這被認爲是不好的做法,因爲消費者可能不知道覆蓋)。第三,您可以爲每個需要此功能的事件在發佈類中編寫一個函數。這似乎應該是可能的,而問題純粹是學術問題。我改變了我的程序結構,所以沒有必要。 – JayMounes