深度复制BindingList <Object>

Rob*_*ert 2 c#

我不知道该如何克隆BindingList<Object>

我想创建一个不共享相同引用的现有列表的新副本。另一个麻烦是我的对象本身包含一个嵌套的BindingList<Object>

我尝试了构造方法:

BindingList<Equation> NewEquationList = 
                         new BindingList<Equation>(OldEquations.ToList());
Run Code Online (Sandbox Code Playgroud)

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

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

我试着隐含一个“复制构造函数”-我仍然不明白与上面的区别是什么,但它也不起作用。

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

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

我该怎么办?

编辑:

我的解决方案是将一个克隆方法添加到Equation的类中。我仍然不明白为什么这可行,而“复制构造函数”却行不通。

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;
}
Run Code Online (Sandbox Code Playgroud)

使用以上内容,以下代码成功创建了深层副本:

NewEquationList = new BindingList<Equation>
        (OldEquations.Select(E => E.Clone()).ToList());
Run Code Online (Sandbox Code Playgroud)

Pau*_*hra 5

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

您的IList使用即

BindingList<Equation> NewEquationList = 
                     new BindingList<Equation>(OldEquations.ToList());
Run Code Online (Sandbox Code Playgroud)

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

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

阅读此SO文章 ……尤其是“序列化对象然后反序列化以获得深克隆的未引用副本”。

通常,即使不是唯一的深拷贝副本收集方法,最好是先进行序列化再进行反序列化舞蹈。