c# - 深度复制 BindingList<Object>

标签 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);
}

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

我尝试将我的方程式类设置为 [Serializable] 并序列化/反序列化对象,但是我收到一个错误,指出我的类中使用的 PropertyChangedEventHandler 未标记为 Serializable。

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

我该怎么办?

编辑:

我的解决方案是将 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 中的元素)是否实现了 ICloneable?如果是这样,那么考虑使用 ICloneable.Clone method然后在创建新列表时手动克隆每个对象。

你的 IList 使用,即

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

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

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

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

通常最好的方法(如果不是唯一的)深度复制收藏就是先序列化然后反序列化。

关于c# - 深度复制 BindingList<Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25034500/

相关文章:

c# - 绘制多维向量的 K-Means 聚类

c# - 无法在 DLL '' 中找到名为 'cvextern' 的入口点

c# - 通过套接字连接发送多个请求

c# - 通过引用传递 IDisposable 对象会导致错误?

c# - Ninject:注入(inject)两个相同类型的不同对象

c# - 在数据集中使用多个数据表

c# - 我需要确保应用程序使用最少数量的数据库连接

c# 首字母大写

c# - 不能在 DropDownList 中选择多个项目

c# - 属性/方法定义