如何复制对象的实例?
我正在尝试编写一些填充List
代码(实际上,它是一系列Lists
,但我们可以假装它只是一个List
)。 我们的想法是在List
添加一个IPackage
,用于订购的IPackage
总量。 请参阅以下代码:
ParseExcel pe = new ParseExcel(); Pinnacle p = pe.ParsePinnacleExcel(); Rack r = new Rack(20,2,4.5,96,42,6,25*12); foreach (PinnacleStock ps in p.StockList.Where(x => x.ColorCode == "10" && x.PackageLength == 30.64)) { for (int i = 1; i <= ps.OnOrder; i++) { r.TryAddPackage((IPackage)ps); } }
在将IPackage
重复添加到列表中的情况下,一切似乎都运行良好。 但是,似乎正在添加对象的相同实例,即每次将对象添加到列表时都不会复制该对象。
我需要做些什么来确保 将对象 的 副本 插入到列表中,而不仅仅是另外的引用?
然后你需要实现ICloneable
和替换
r.TryAddPackage((IPackage)ps);
同
r.TryAddPackage((IPackage)ps.Clone());
由您来决定Clone
应该如何填充它返回的PinnacleStock
新实例。
在最基本的层面上,你可以说
public PinnacleStock : ICloneable { public PinnacleStock Clone() { return (PinnacleStock)this.MemberwiseClone(); } object ICloneable.Clone() { return Clone(); } // details }
这只是PinnacleStock
的浅层副本。 只有您知道这是否是您的域的正确语义。
如果您只需要浅拷贝,那么您可以编写快速修复克隆方法:
public class PinnacleStock : ICloneable { public PinnacleStock Clone() { return (PinnacleStock)this.MemberwiseClone(); } object ICloneable.Clone() { return Clone(); } // Other methods }
如果你需要深层复制(即如果PinnacleStock
有你想要复制的子对象),那么你需要自己编写一个。
正如其他人所说,你需要以PinnacleStock特定的方式制作该副本:
foreach (PinnacleStock ps in p.StockList.Where(x => x.ColorCode == "10" && x.PackageLength == 30.64)) { for (int i = 1; i <= ps.OnOrder; i++) { PinnacleStock clone = ps.CopySomehow(); // your problem r.TryAddPackage((IPackage)clone); } }
但是,您可能想要质疑这是否是正确的解决方案。 你真的需要一个单独的PinnacleStock实例吗? 将PinnacleStock添加到机架中是否真的创建了一个新的独立实例? 您是打算单独修改或跟踪这些单独的副本吗? 现在你的PinnacleStock实例没有出现在你的StockList中,这是正确的吗? 不知道你的领域或PinnacleStock的语义,很难确定,但你可能想要考虑创建一个PinnacleStockRackEntry对象来代表PinnacleStock的实例 - 当然取决于预期的语义!
您必须提供自己复制对象的逻辑。 .Net没有内置的深拷贝(序列化有明显的潜在例外)。 它最接近的是MemberwiseClone()方法,但即使这样也会复制您自己类型的任何成员的引用。