如何在不使用 MemberwiseClone 的情况下在抽象 class 上实现 Clone 方法?

How can I implement a Clone method on an abstract class without using MemberwiseClone?

我有一个抽象基 class 定义如下:

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

    public event public event PropertyChangedEventHandler PropertyChanged;

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

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

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

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

正如@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;
    }
}