IEditableObject实现

时间:2013-02-21 08:20:17

标签: 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;
}

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

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

更新

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

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

1 个答案:

答案 0 :(得分:3)

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

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

想一个项目清单;如果应用浅拷贝,最终会有两个指向同一对象的列表。如果应用深层复制,将为新列表创建新对象。

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