【问题标题】:c# how to add class to a list from an array of classesc#如何从类数组中将类添加到列表中
【发布时间】:2013-11-13 05:49:11
【问题描述】:

我有一个类来定义例如一艘船,然后我有一个包含一些默认参数的类数组但是稍后我希望能够使用预定义的示例之一添加到类列表中。我不知道如何将预定义类添加到列表中,同时创建它的副本而不是指向原始数组的指针。这是希望让一切变得清晰的代码。

   public enum ShipType
    {
      Capital,
      Cruiser,
      Frigate,
      Fighter,
      Colony,
      NumShipTypes
    }
    public class Ship
    {
      public Vector3 ShipPosition;
      public ShipType Type;
      public string DesignName;
      public Ship(ShipType type,string designame)
      {
        Type = type;
        DesignName = designame;
        ShipPosition = Vector3.zero;
      }
    }

然后是我的默认类型数组:-

public Ship[] AllShips = new Ship[(int)ShipType.NumShipTypes]
  { 
    new Ship(ShipType.Capital,"MassiveOne"),
    new Ship(ShipType.Cruiser,"MediumOne"),
    new Ship(ShipType.Frigate,"SmallerOne"),
    new Ship(ShipType.Fighter,"TinyOne"),
    new Ship(ShipType.Colony,"Mayflower")
  };

现在我创建了一个列表,并在此处添加了上述内容之一的副本:-

public List<Ship> FleetShips = new List<Ship>(); 

FleetShips.Add(AllShips[(int)ShipType.Fighter]); 

但这似乎只是在数组中添加一个引用或指针。我需要的是这样的东西,但这确实有效:-

FleetShips.Add(new AllShips[(int)ShipType.Fighter]()); 

但这给了我“是一个字段,但像类型一样使用”错误

有什么想法吗?

【问题讨论】:

    标签: c# arrays list class templates


    【解决方案1】:

    您可以让您的类实现ICloneable 接口并实现您自己的Clone() 方法。

    然后,当您想将其添加到您的收藏中时,您可以这样做

    FleetShips.Add((Ship)AllShips[(int)ShipType.Fighter].Clone());
    

    【讨论】:

    • 感谢我采用了这个解决方案。
    • 太棒了!很高兴我能帮上忙。
    【解决方案2】:

    实现 ICloneable。

       public class Ship: ICloneable
        {
            public Vector3 ShipPosition;
            public ShipType Type;
            public string DesignName;
            public Ship(ShipType type, string designame)
            {
                Type = type;
                DesignName = designame;
                ShipPosition = Vector3.zero;
            }
    
    
            public object Clone()
            {
               return this.MemberwiseClone();
            }
        }
    

    添加

    FleetShips.Add(AllShips[(int)ShipType.Fighter].Clone() as Ship); 
    

    编辑:仍然可能是一个问题,具体取决于 Vector3 是什么

    【讨论】:

    • 谢谢,我选择了这个版本,因为我在船级上有更多的东西,而且打字似乎少得多!也感谢您的示例,我对 c# 更复杂的部分仍然很陌生(来自 C 背景)
    • 不客气。但请注意,这只会创建对象的浅表副本。如果您有任何引用类型,它们仍然是共享的。
    【解决方案3】:

    另一种可能性是向您的 Ship-class 添加一个复制构造函数。

    public class Ship
    {
      public Vector3 ShipPosition;
      public ShipType Type;
      public string DesignName;
      public Ship(ShipType type,string designame)
      {
        Type = type;
        DesignName = designame;
        ShipPosition = Vector3.zero;
      }
      //copy-constructor
      public Ship(Ship other)
      {
        Type = other.Type;
        DesignName = other.DesignName;
        ShipPosition = Vector3.zero;
      }
    }
    

    当你想添加你做的船的副本时

    FleetShips.Add(new Ship(AllShips[(int)ShipType.Fighter]));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-15
      相关资源
      最近更新 更多