使用所有存储的值克隆一个实例

Make a clone of an instanced with all the stored values

我有两个 classes,一个叫 warehouse,一个叫 Warehouselocations。 仓库当前能够在仓库位置创建、存储和查找箱子。

但现在我还需要仓库能够使用所有存储的信息创建 wareHouseLocation 的克隆版本。

   locations = new List<WareHouseLocation>();

这是我存储所有信息的列表。我希望能够复制它。

我试图找到自己的答案,甚至尝试了一些代码,但到目前为止我没有任何能正常工作的东西。

    public WareHouseLocation DeepCopy() 
    {
        foreach (WareHouseLocation  wareHouseLocation in locations)
            {
                if(wareHouseLocation == null) 
                {
                    return null;
                }
                else 
                {
                   //Need code here
                }
              }
           return null;
        }

代码目前在仓库中class。 我很高兴任何能帮助我的事情。

    public class WareHouseLocation
    {
        public int FloorID { get; set; }
        public List<I3DStorageObject> storage = new List<I3DStorageObject>();


        public double MaxVolume;
        public double MaxWeight;

        public WareHouseLocation(double height, double width, double depth)
        {
            MaxVolume = height * width * depth;
            MaxWeight = 1000;
        }


        public bool hasAvailableVolumeForObject(I3DStorageObject s)
        {
            double currentVolume = 0;


            foreach (I3DStorageObject obj in storage)
            {
                currentVolume += obj.Volume;
            }

            double available = MaxVolume - currentVolume;


            if (s.Volume <= available)
            {
                return true;
            }
            else
            {
                return false;
            }

        }



    }

这是 WareHouseLocation 的代码。

我认为你可以使用 JsonConvert.SerializeObject 和 JsonConvert.DeserializeObject 进行复制,

    var json = JsonConvert.SerializeObject(put_your_object_here);
    var copy = JsonConvert.DeserializeObject<your_object_type>(json);

你可以通过实现ICloneable接口来实现:

public class WareHouseLocation : ICloneable
{
    public int FloorID { get; set; }
    public List<I3DStorageObject> storage = new List<I3DStorageObject>();

    public double MaxVolume;
    public double MaxWeight;

    //rest of code

    public object Clone()
    {
        var copy = (WareHouseLocation)MemberwiseClone();
        copy.storage = storage.Select(item => (I3DStorageObject)item.Clone()).ToList();

        return copy;
    }
}

因为你在 WareHouseLocation 中有一个 List 引用类型,你还需要通过为 I3DStorageObject 实现 ICloneable 来正确克隆它,因为MemberwiseClone 只复制引用,而不是引用对象本身

public class I3DStorageObject : ICloneable
{
    public double Volume { get; set; }
    public object Clone()
    {
        return MemberwiseClone();
    }
}

您还可以查看 MemberwiseClone 以了解 deep/shallow 对象副本的详细信息和示例