我正在尝试编写一些填充a的代码List(实际上,它是一系列代码Lists,但我们可以假装它只是一个代码List).我们的想法是一种添加IPackage到List了总量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);
}
}
Run Code Online (Sandbox Code Playgroud)
在IPackage重复添加到列表中的情况下,一切似乎都运行良好.但是,似乎正在添加对象的相同实例,即每次将对象添加到列表时都不会复制该对象.
我需要做些什么来确保 将对象的副本 插入到列表中,而不仅仅是附加引用?
jas*_*son 13
然后你需要实现ICloneable和替换
r.TryAddPackage((IPackage)ps);
Run Code Online (Sandbox Code Playgroud)
同
r.TryAddPackage((IPackage)ps.Clone());
Run Code Online (Sandbox Code Playgroud)
由您来决定如何Clone填充PinnacleStock它返回的新实例.
在最基本的层面上,你可以说
public PinnacleStock : ICloneable {
public PinnacleStock Clone() {
return (PinnacleStock)this.MemberwiseClone();
}
object ICloneable.Clone() {
return Clone();
}
// details
}
Run Code Online (Sandbox Code Playgroud)
这只是做一个浅的副本PinnacleStock.只有您知道这是否是您的域的正确语义.
如果您只需要浅拷贝,那么您可以编写快速修复克隆方法:
public class PinnacleStock : ICloneable
{
public PinnacleStock Clone()
{
return (PinnacleStock)this.MemberwiseClone();
}
object ICloneable.Clone()
{
return Clone();
}
// Other methods
}
Run Code Online (Sandbox Code Playgroud)
如果你需要一个深层复制(即如果PinnacleStock你有想要复制的子对象),那么你需要自己编写一个.