我有一个对象列表,比如List<Bar> barlist
。这些Bar
或者对象相当复杂,我很乐意在没有深度复制的情况下继续使用它们。
但是,我想允许用户使用BindingSource
,BindingNavigator
和DataGridView
修改它们。但是,如果我将DataSource
设置为我的条形码并修改值,则BindingSource
会修改我的列表(因为它显然不会保留自己的列表,或仅使用浅层副本)。
问题是:如果用户想要丢弃他的更改怎么办?我必须手动还原它们,或者如果我给BindingSource
深层复制列表,则不要将它们应用到原始列表中。但是,我想避免深度复制。
有替代路径吗?或者我没有其他选择,只能将对象标记为Serializable
并对其进行深层复制?
答案 0 :(得分:2)
为了记录,我使用了以下深度克隆功能来解决问题。它可能不是最好的解决方案,但它已经足够并且可以正常工作(尽管仅适用于Serializable对象)
// Creates a deep copy of an Object
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
答案 1 :(得分:1)
我建议使用Memento Pattern。
您基本上需要创建一个单独的对象,该对象可以将每个Bar的状态恢复为用户开始编辑之前的状态。这通常比深拷贝更容易且更便宜。