我一直在寻找实现一个泛型类来实现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继承的通用抽象基类,但你明白了......
这有什么区别?除了不支持深拷贝之外,我的方法有哪些缺点?你会如何修改它以支持深层复制(不确定是否有必要)?
发现这篇文章显示了比使用反射更好的实现。还比我链接的其他两篇文章简单得多:
我们如何扩展它以支持深层复制?
答案 0 :(得分:3)
实际上,MemberwiseClone
应用浅拷贝。如果应用浅复制,则不会创建对象内的引用类型对象(如某些引用类型属性),只会复制引用。所以每个实例都会引用相同的对象。
在深层复制中,对象内的引用类型对象也会被复制。
想一个项目清单;如果应用浅拷贝,最终会有两个指向同一对象的列表。如果应用深层复制,将为新列表创建新对象。
我建议你使用深拷贝,而不是浅拷贝。想想列表示例;如果您应用浅拷贝并更改复制列表中的任何元素,则无法还原所有更改;因为复制的列表与原始列表共享相同的元素。