IEditableObject实现

Tom*_*sen 8 c# wpf

我一直在寻找实现一个实现IEditableObject的泛型类,以便我的一些ViewModel继承,以支持取消对ViewModel中属性的编辑.这主要用于WPF中具有"确定"和"取消"按钮的模式对话框.

我在网上找到了以下实现:

这对我来说似乎过于复杂,但我不确定我是否遗漏了他们提供的一些功能.对于一个他们不支持深拷贝,所以在我的世界中我们可以使用MemberwiseClone来执行浅拷贝.就像是:

private Item backupCopy;
private bool inEdit;

public void BeginEdit()
{
    if (inEdit) return;
    inEdit = true;
    backupCopy = this.MemberwiseClone() as Item;
}

public void CancelEdit()
{
    if (!inEdit) return;
    inEdit = false;
    this.Name = backupCopy.Name;
}

public void EndEdit()
{
    if (!inEdit) return;
    inEdit = false;
    backupCopy = null;
}
Run Code Online (Sandbox Code Playgroud)

这个例子当然应该是ViewModel继承的通用抽象基类,但你明白了......

这有什么区别?除了不支持深拷贝之外,我的方法有哪些缺点?你如何修改它以支持深层复制(不确定是否有必要)?

更新:

发现这篇文章显示了比使用反射更好的实现.比我链接的其他两篇文章简单得多:

我们如何扩展它以支持深层复制?

dar*_*yal 3

其实就是MemberwiseClone应用了浅拷贝。如果应用浅复制,则不会创建对象内的引用类型对象(如某些引用类型属性),而只会复制引用。所以每个实例都会引用相同的对象。

在深复制中,对象内部的引用类型对象也会被复制。

想出一个项目清单;如果应用浅复制,最终将得到两个指向相同对象的列表。如果应用深复制,将为新列表创建新对象。

我建议您使用深复制,而不是浅复制。考虑一下列表示例;如果您应用浅复制并更改复制列表中的任何元素,则将无法恢复所有更改;因为复制的列表与原始列表共享相同的元素。