2

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

但是,我想允许用户使用 a 和 a 来BindingSource修改BindingNavigator它们DataGridView。但是,如果我将 设置DataSource为我的 barlist 并修改值,则会BindingSource修改我的列表(因为它显然不包含自己的列表,或者仅使用浅拷贝)。

这样做的问题是:如果用户想放弃他的更改怎么办?BindingSource如果我提供深度复制的列表,我将不得不手动还原它们或不将它们应用于原始列表。但是,我想避免深度复制。

有替代路径吗?还是我别无选择,只能将对象标记为Serializable并深度复制它们?

4

2 回答 2

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);
    }
}
于 2013-02-27T14:19:15.637 回答
1

我建议使用Memento Pattern

您基本上需要创建一个单独的对象,该对象可以将每个 Bar 的状态恢复到用户开始编辑之前的状态。这通常比深拷贝更容易且更便宜。

于 2013-02-02T15:02:50.093 回答