深度复制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中的元素)实现iclonable吗?如果是这样,那就考虑使用iclonable。方法,然后在创建新列表时手动克隆每个对象。
您的illist使用即
BindingList<Equation> NewEquationList =
new BindingList<Equation>(OldEquations.ToList());
只是创建一个具有相同引用的副本(浅副本)。
如果对象(BindingList中的元素)是可序列化的…
读一读这个SO帖子,特别是"序列化对象然后反序列化以获得深度克隆的非引用副本"。
通常深度复制集合最好的(如果不是唯一的)方法是先序列化再反序列化。