我需要一份深刻的副本吗?

时间:2013-02-02 14:42:24

标签: c# winforms

我有一个对象列表,比如List<Bar> barlist。这些Bar或者对象相当复杂,我很乐意在没有深度复制的情况下继续使用它们。

但是,我想允许用户使用BindingSourceBindingNavigatorDataGridView修改它们。但是,如果我将DataSource设置为我的条形码并修改值,则BindingSource会修改我的列表(因为它显然不会保留自己的列表,或仅使用浅层副本)。

问题是:如果用户想要丢弃他的更改怎么办?我必须手动还原它们,或者如果我给BindingSource深层复制列表,则不要将它们应用到原始列表中。但是,我想避免深度复制。

有替代路径吗?或者我没有其他选择,只能将对象标记为Serializable并对其进行深层复制?

2 个答案:

答案 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的状态恢复为用户开始编辑之前的状态。这通常比深拷贝更容易且更便宜。