【问题标题】:Deep Copy a BindingList<Object>深度复制 BindingList<Object>
【发布时间】:2014-07-30 10:28:24
【问题描述】:

我不明白如何克隆BindingList&lt;Object&gt;

我想创建一个不共享相同引用的现有列表的新副本。另一个复杂之处是我的对象本身包含一个嵌套的BindingList&lt;Object&gt;

我尝试了构造方法:

BindingList<Equation> NewEquationList = 
                         new BindingList<Equation>(OldEquations.ToList());

然后我尝试遍历列表,设置新值:

BindingList<Equation> NewEquationList;
foreach (Equation OldEquation in OldEquations)
{
    Equation NewEquation = new Equation()
    {
        NewEquation.ID = OldEquation.ID,
        ...
    };
    NewEquationList.Add(NewEquation);
}

我尝试使用“复制构造函数” - 我仍然不明白它与上述有何不同,但它也不起作用。

我尝试将我的 Equation 类设置为 [Serializable] 并对对象进行序列化/反序列化,但是我收到一条错误消息,指出我的类中使用的 PropertyChangedEventHandler 未标记为可序列化。

我不认为制作引用类型的值副本会是一个复杂的过程,但是我在完成这项工作时遇到了困难。

我该怎么办?

编辑:

我的解决方案是在 Equation 的类中添加一个 Clone 方法。我仍然不明白为什么这行得通而“复制构造函数”却没有。

public Equation Clone()
{
    Equation NewEquation = new Equation();
    NewEquation.ID = this._ID;
    ...

    //Nested BindingList:
    NewEquation.EquationVariables = new BindingList<EquationVariable>  
            (this._EquationVariables.Select(EV => EV.Clone()).ToList());

    return NewEquation;
}

使用上面的,下面成功创建了一个深拷贝:

NewEquationList = new BindingList<Equation>
        (OldEquations.Select(E => E.Clone()).ToList());

【问题讨论】:

  • 我看不出你的循环是如何工作的。在什么情况下它不起作用?
  • 当我将新列表绑定到新窗口的 ListView 时,我可以看到旧列表在旧窗口上发生变化(两者同时打开)。

标签: c#


【解决方案1】:

您的对象(BindingList 中的元素)是否实现了 ICloneable?如果是这样,请考虑使用ICloneable.Clone method,然后在创建新列表时手动克隆每个对象。

您的 IList 使用即

BindingList<Equation> NewEquationList = 
                     new BindingList<Equation>(OldEquations.ToList());

只需创建具有相同引用的副本(浅副本)。

如果对象(BindingList 中的元素)是可序列化的...

阅读 this SO post... 尤其是“序列化对象然后反序列化以获得深度克隆的非引用副本”。

如果不是深度复制集合的唯一方法,最好的方法通常是先序列化然后反序列化。

【讨论】:

  • 在添加问题之前,我尝试关注该帖子。我收到一条错误消息,指出我的 PropertyChangedEventHandler 未标记为可序列化。我尝试使用 [field: NonSerialized] 标记 EventHandler,但在尝试反序列化对象时收到错误消息。我现在将研究 ICloneable。
  • NewEquationList = new BindingList&lt;Equation&gt;(OldEquations.Select(E =&gt; E.Clone()).ToList()); - 效果很好!您知道为什么“复制构造函数”技术不起作用吗?
  • 恐怕不会。
  • 对我来说,没有一个有用,但是序列化和反序列化就像一个魅力
猜你喜欢
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2017-04-09
  • 2012-12-15
  • 2012-10-04
  • 2015-02-28
  • 2011-02-28
相关资源
最近更新 更多