如何复制对象的实例?

Ben*_*ack 14 .net c# oop

我正在尝试编写一些填充a的代码List(实际上,它是一系列代码Lists,但我们可以假装它只是一个代码List).我们的想法是一种添加IPackageList了总量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.只有您知道这是否是您的域的正确语义.


Aar*_*ght 5

如果您只需要浅拷贝,那么您可以编写快速修复克隆方法:

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你有想要复制的子对象),那么你需要自己编写一个.