存储一个EventHandler列表以取消订阅

时间:2011-05-13 09:28:47

标签: c# events reflection

我有一个带有方法Register的类,它使用标准aClass.SomeEvent += the_handler订阅它包含的类上的许多事件。此类还有一个Unregister方法,可以使用-=取消订阅这些事件。这很好但我们发现如果我们添加一个新事件来订阅它,很容易忘记在Unregister中包含取消订阅。这种维护事件订阅的手动方法被证明是脆弱的。

有没有办法维护一个可以迭代和动态取消订阅的订阅列表? (并且在Register之后调用Unregister时可能会迭代并重新订阅。

一些细节:该类引用了其他3个类(目前但不限于3个),这些类上的各种事件都是EventHandlerEventHandler<T>类型。

2 个答案:

答案 0 :(得分:3)

如何从EventHandler.GetInvocationList()获取调用列表然后通过并手动删除/取消注册它们?请注意,您只能从具有该EventHandler的类访问GetInvationList()方法,因此您可能需要公开方法UnregisterAll()以确保它删除事件调用列表中的所有delagates

您还可以确保您的班级继承IDisposable并使用using(){ },它会调用Dispose来清理所有订阅者

答案 1 :(得分:0)

经过深入研究后,我找到了这个答案:

C# Dynamic Event Subscription

这就是我想要的(差不多)。我不喜欢使用字符串来命名事件,因此我不再进一步追求这种设计。虽然这不是我想要的设计,但答案显示了一种非常有用的方法来实现所需的行为,因此我将其标记为已被接受。