【问题标题】:Clear All Event subscriptions (Clone linked)清除所有事件订阅(克隆链接)
【发布时间】:2011-02-23 06:30:32
【问题描述】:

我刚刚从 ICloneable 实现了 Clone,并意识到来自我的源实例的事件订阅也随之而来。有什么好的方法可以清除所有这些吗?

目前,我为每个事件都使用了几个这样的循环,我必须清除所有内容。

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

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

这工作正常,但代码有点混乱。主要是担心让事件悬空。

【问题讨论】:

    标签: c# events clone


    【解决方案1】:

    我认为您可以在克隆对象中设置OnIdChanged = null

    创建克隆后,您只需在克隆上调用ClearEvents 方法即可。

    public class ClonedObject
    {
        public event EventHandler OnIdChanged;
        public event EventHandler OnNameChanged;
    
        public void ClearEvents()
        {
            OnIdChanged = null;
            OnNameChanged = null;
        }
    }
    

    【讨论】:

    • 这行得通,所以我将其标记为答案。虽然我正在考虑在 Randolpho 回答后进行重构
    • @mattias,我只是考虑了您的问题,而不是您的解决方案在我的回答中的含义。 Randolpho 的建议可能更好。
    【解决方案2】:

    大概,如果你真的想克隆一个对象,你想保留那些事件订阅。

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

    最终,我建议您通过不订阅不需要订阅的事件来解决此问题。从不同的角度看问题空间。

    【讨论】:

    • 当我读到这个问题时,我也有同样的想法。 Clone() 表示您确实在克隆对象、事件和所有内容。
    猜你喜欢
    • 2018-08-06
    • 2010-11-20
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多