深度复制bindinglist对象

本文关键字:对象 bindinglist 复制 深度 | 更新日期: 2023-09-27 18:15:40

我不明白如何克隆一个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。

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

我该怎么办?

编辑:

我的解决方案是在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());

深度复制bindinglist对象

你的对象(BindingList中的元素)实现iclonable吗?如果是这样,那就考虑使用iclonable。方法,然后在创建新列表时手动克隆每个对象。

您的illist使用即

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

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

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

读一读这个SO帖子,特别是"序列化对象然后反序列化以获得深度克隆的非引用副本"。

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

相关文章: