我想在 observablecollection 中复制一个列表项。当我这样做时:
TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition];
它创建了特定列表项的副本,但随后它们在我的 UI 中进行了链接。因此,如果我更改新的重复项的名称,它会更改原始名称。我知道我可以一个一个地设置每个属性(见下文)但是有没有办法只复制整个项目?
TreasureCards[TreasureCards.Count - 1].Name = TreasurecCards[CardPosition].Name;
TreasureCards[TreasureCards.Count - 1].Type= TreasurecCards[CardPosition].Type;
// etc
最佳答案
您没有复制对象。您正在创建对该对象的新引用。仍然只有一个对象;现在您的集合中有两个对它的引用,并且对对象的任何更改都会反射(reflect)在两个引用中。
要创建新对象,您可以对从 Object
派生的任何对象调用 MemberwiseClone()
。此方法返回一个新实例,复制原始对象中所有字段的值。所以你会这样做:
TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition].MemberwiseClone();
此方法有两个限制。首先,它是一个浅拷贝,即原始对象中的任何引用字段都复制了它们的值。因此,如果 a.Foo
是对 Bar
对象的引用,则 a.MemberwiseClone().Foo
将引用相同的 Bar
对象。其次,该方法只是复制字段;它不调用新对象的构造函数。根据类的设计,这要么不重要,要么非常重要。
通常,让类实现ICloneable
并显式实现Clone()
方法会更安全,例如:
public TreasureCard Clone()
{
return new TreasureCard
{
Name = this.Name,
Type = this.Type,
...
};
}
关于c# - 复制一个 ObservableCollection 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5408594/