我刚从ICloneable实现了Clone,并意识到我的源实例中的事件订阅也随之而来。有清除所有这些的好方法吗?
目前我正在为每个事件使用几个这样的循环来清理所有事件。
foreach (var eventhandler in OnIdChanged.GetInvocationList())
{
OnIdChanged -= (ItemEventHandler) eventhandler;
}
foreach (var eventhandler in OnNameChanged.GetInvocationList())
{
...
这样可以正常工作,但会使代码混乱。最担心的是事件悬空。
答案 0 :(得分:2)
我认为您可以在克隆对象中设置OnIdChanged = null
。
创建克隆后,只需在克隆上调用ClearEvents
方法。
public class ClonedObject
{
public event EventHandler OnIdChanged;
public event EventHandler OnNameChanged;
public void ClearEvents()
{
OnIdChanged = null;
OnNameChanged = null;
}
}
答案 1 :(得分:2)
据推测,如果你真的想要克隆一个对象,你想保持那些事件订阅。
如果您正在克隆不应订阅事件的对象,那么您应该考虑重构代码。让您的控制器或类似对象通过引用专用数据对象来订阅事件,并让您的数据对象存储该数据而不引用事件;克隆数据对象并根据需要将它们放在适当的控制器对象中。
最终,我建议您不要订阅您不需要订阅的活动来解决问题。从不同的角度看问题空间。