清除所有活动订阅(已克隆链接)

时间:2010-05-24 14:27:44

标签: c# events clone

我刚从IClo​​neable实现了Clone,并意识到我的源实例中的事件订阅也随之而来。有清除所有这些的好方法吗?

目前我正在为每个事件使用几个这样的循环来清理所有事件。

foreach (var eventhandler in OnIdChanged.GetInvocationList())
{
    OnIdChanged -= (ItemEventHandler) eventhandler;
}

foreach (var eventhandler in OnNameChanged.GetInvocationList())
{
    ...

这样可以正常工作,但会使代码混乱。最担心的是事件悬空。

2 个答案:

答案 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)

据推测,如果你真的想要克隆一个对象,你想保持那些事件订阅。

如果您正在克隆不应订阅事件的对象,那么您应该考虑重构代码。让您的控制器或类似对象通过引用专用数据对象来订阅事件,并让您的数据对象存储该数据而不引用事件;克隆数据对象并根据需要将它们放在适当的控制器对象中。

最终,我建议您不要订阅您不需要订阅的活动来解决问题。从不同的角度看问题空间。