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