0

我有一个这样定义的抽象基类:

public abstract class BaseItem: INotifyPropertyChanged, ICloneable
{
    // Various Properties...

    public event public event PropertyChangedEventHandler PropertyChanged;

    public object Clone()
    {
        var clone = (BaseItem)MemberwiseClone();
        return clone;
    }
}

派生类继承并使用基类的 Clone 方法,因此它们不必实现自己的 Clone 方法(加上一些额外的、不相关的原因)。

通常,此代码按预期工作。唯一的问题是有一个不需要的副作用。因为我使用 MemberwiseClone 来克隆实例,所以引用类型是浅拷贝的,不幸的是其中包括事件。因此,任何已订阅原始实例事件的对象也将订阅克隆实例上的事件。这就是问题。

有什么方法可以使用 BaseItem.Clone 方法克隆 BaseItem 派生类的实例,而无需克隆事件?

4

1 回答 1

0

正如@JohnWu 在评论中提到的那样,对我有用的解决方案是将事件处理程序设置为 null 以删除其所有订阅者。

public abstract class BaseItem: INotifyPropertyChanged, ICloneable
{
    // Various Properties...

    public event PropertyChangedEventHandler PropertyChanged;

    public object Clone()
    {
        var clone = (BaseItem)MemberwiseClone();
        clone.PropertyChanged = null;
        return clone;
    }
}
于 2021-01-25T17:47:14.627 回答