IEditableObject实现

8
我一直在寻找实现通用类以实现IEditableObject的一些ViewModel,以便支持取消对该ViewModel中属性的编辑。这主要用于WPF中带有OK和Cancel按钮的模态对话框。
我在网上找到了以下实现:
- 通过TypeDescriptor和Reflection实现IEditableObject的通用实现 - Paul Stovell:适用于WPF和Windows Forms的IEditableObject适配器 这对我来说似乎过于复杂,但我不确定是否错过了它们提供的某些功能。首先,它们不支持深层复制,因此在我的世界中,我们可以使用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继承使用,但你明白我的意思...

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

更新:

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

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


3
最后一个链接已经失效,可以在网络档案馆中找到新链接:https://web.archive.org/web/20160202215105/http://indepthdev.azurewebsites.net:80/2010/10/reusable-editablemodelbase-using-ieditableobject/ - Eric Bole-Feysot
1个回答

3
实际上,MemberwiseClone方法只进行浅复制。如果使用浅复制,则对象内的引用类型对象(如某些引用类型属性)不会被创建,只是引用被复制。因此每个实例将引用相同的对象。
在深度复制中,对象内的引用类型对象也会被复制。
想象一下一个项目列表;如果您应用了浅复制,您最终将得到两个指向相同对象的列表。如果应用了深度复制,新的对象将为新列表创建。
我建议您使用深复制,而不是浅复制。考虑列表示例,如果您应用了浅复制并更改了复制列表中的任何元素,则不可能将所有更改还原回去;因为复制的列表与原始列表共享相同的元素。

我知道浅拷贝和深拷贝的区别,而且知道MemberwiseClone执行的是浅拷贝。请看我的更新;你有什么建议可以使用这种方法来实现深拷贝吗? - Tommy Jakobsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接