深层复制BindingList <object> </object>

时间:2014-07-30 10:28:24

标签: c#

我不明白如何克隆BindingList<Object>

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

我尝试了构造函数方法:

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未标记为Serializable。

我不认为制作参考类型的值副本会是一个复杂的过程,但是我很难做到这一点。

我该怎么办?

修改

我的解决方案是将Clone方法添加到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;
}

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

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

1 个答案:

答案 0 :(得分:3)

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

您的IList使用即

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

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

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

读取this SO post ...特别是&#34;序列化对象然后反序列化以获得深度克隆的非引用副本&#34;。

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