8

我一直在寻求实现一个通用类,该类实现 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;
}

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

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

更新:

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

我们如何扩展它以支持深拷贝?

4

1 回答 1

3

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

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

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

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

于 2013-02-21T08:30:04.147 回答