【发布时间】:2014-07-30 10:28:24
【问题描述】:
我不明白如何克隆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 未标记为可序列化。
我不认为制作引用类型的值副本会是一个复杂的过程,但是我在完成这项工作时遇到了困难。
我该怎么办?
编辑:
我的解决方案是在 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());
【问题讨论】:
-
我看不出你的循环是如何工作的。在什么情况下它不起作用?
-
当我将新列表绑定到新窗口的 ListView 时,我可以看到旧列表在旧窗口上发生变化(两者同时打开)。
标签: c#