首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >深拷贝BindingList<Object>

深拷贝BindingList<Object>
EN

Stack Overflow用户
提问于 2014-07-30 10:28:24
回答 1查看 7K关注 0票数 4

我不知道如何复制BindingList<Object>

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

我尝试了构造函数方法:

代码语言:javascript
复制
BindingList<Equation> NewEquationList = 
                         new BindingList<Equation>(OldEquations.ToList());

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

代码语言:javascript
复制
BindingList<Equation> NewEquationList;
foreach (Equation OldEquation in OldEquations)
{
    Equation NewEquation = new Equation()
    {
        NewEquation.ID = OldEquation.ID,
        ...
    };
    NewEquationList.Add(NewEquation);
}

我试着请求一个‘复制构造器’-我仍然不明白这与上面的区别,但它也没有工作。

我尝试将等式类设置为Serializable和序列化/反序列化对象,但是我收到了一个错误,说明在我的类中使用的PropertyChangedEventHandler没有标记为Serializable。

我不认为制作一个参考类型的值副本将是一个复杂的过程,但我有困难,使这项工作。

我该怎么办?

编辑:

我的解决方案是在方程的类中添加一个Clone方法。我仍然不明白为什么这是有效的,而‘复制构造器’没有。

代码语言:javascript
复制
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;
}

使用上述方法,以下内容成功地创建了一个深度副本:

代码语言:javascript
复制
NewEquationList = new BindingList<Equation>
        (OldEquations.Select(E => E.Clone()).ToList());
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-30 11:05:12

对象(BindingList中的元素)实现ICloneable吗?如果是,那么考虑使用ICloneable.Clone法,然后在创建新列表时手动克隆每个对象。

您的IList使用,即

代码语言:javascript
复制
BindingList<Equation> NewEquationList = 
                     new BindingList<Equation>(OldEquations.ToList());

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

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

读一读这是如此的帖子…特别是“序列化对象然后反序列化以获得深度克隆的非引用副本”。

通常,最好的,如果不是唯一的方式,深入复制收集是做序列化,然后反序列化舞蹈。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25034500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档