我有一个带有方法Register
的类,它使用标准aClass.SomeEvent += the_handler
订阅它包含的类上的许多事件。此类还有一个Unregister
方法,可以使用-=
取消订阅这些事件。这很好但我们发现如果我们添加一个新事件来订阅它,很容易忘记在Unregister
中包含取消订阅。这种维护事件订阅的手动方法被证明是脆弱的。
有没有办法维护一个可以迭代和动态取消订阅的订阅列表? (并且在Register
之后调用Unregister
时可能会迭代并重新订阅。
一些细节:该类引用了其他3个类(目前但不限于3个),这些类上的各种事件都是EventHandler
或EventHandler<T>
类型。
答案 0 :(得分:3)
如何从EventHandler.GetInvocationList()
获取调用列表然后通过并手动删除/取消注册它们?请注意,您只能从具有该EventHandler的类访问GetInvationList()方法,因此您可能需要公开方法UnregisterAll()以确保它删除事件调用列表中的所有delagates
您还可以确保您的班级继承IDisposable
并使用using(){ }
,它会调用Dispose来清理所有订阅者
答案 1 :(得分:0)
经过深入研究后,我找到了这个答案:
这就是我想要的(差不多)。我不喜欢使用字符串来命名事件,因此我不再进一步追求这种设计。虽然这不是我想要的设计,但答案显示了一种非常有用的方法来实现所需的行为,因此我将其标记为已被接受。