如何复制对象的实例?

我正在尝试编写一些填充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()方法,但即使这样也会复制您自己类型的任何成员的引用。