克隆具有所有存储值的实例

问题描述 投票:0回答:2

我有两类,一类称为仓库,一类称为Warehouselocations。Warehouse目前能够在仓库位置创建,存储和查找盒子。

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

   locations = new List<WareHouseLocation>();

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

我试图找到自己的答案,甚至尝试了一些代码,但到目前为止,我什么都没有正常工作。

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

该代码当前在WareHouse类中。我为任何可以帮助我的事情感到高兴。

    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的代码。

c# deep-copy
2个回答
0
投票

您可以通过实现ICloneable接口来实现,就像这样:

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


        public double MaxVolume;
        public double MaxWeight;

        ...

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

            return copy;
        }
    }

由于List中有一个WareHouseLocation引用,因此也必须通过为ICloneable实现I3DStorageObject来正确克隆此引用,因为MemberwiseClone仅复制引用,而不复制引用的对象

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

您也可以在MSDN中查找MemberwiseClone方法和对象的深/浅副本的详细信息和示例


0
投票

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

    var json = JsonConvert.SerializeObject(put_your_object_here);
    var copy = JsonConvert.DeserializeObject<your_object_type>(json);
© www.soinside.com 2019 - 2024. All rights reserved.