如何清除C#中某个特定事件处理程序的订阅?
问题描述:
我一直在研究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