gpt4 book ai didi

c# - IEditableObject 实现

转载 作者:太空狗 更新时间:2023-10-29 19:44:13 28 4
gpt4 key购买 nike

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

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

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

更新:

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

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

最佳答案

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

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

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

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

关于c# - IEditableObject 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997504/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com