深层复制BindingList

我不明白如何克隆BindingList

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

我尝试了构造函数方法:

 BindingList NewEquationList = new BindingList(OldEquations.ToList()); 

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

 BindingList 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 (this._EquationVariables.Select(EV => EV.Clone()).ToList()); return NewEquation; } 

使用上面的代码,以下成功创建了一个深层副本:

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

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

您的IList使用ie

 BindingList NewEquationList = new BindingList(OldEquations.ToList()); 

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

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

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

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