如何初始化动态创建的数组对象?

时间:2013-09-03 07:13:25

标签: c# arrays initialization

class bishop:unit {}
class knight:unit {}
class peasant:unit {}

void Battle(unit first, unit second, byte firstAmount, byte secondAmount)
{
  System.Array sideA = System.Array.CreateInstance(first.GetType(),firstAmount);
  for(int i=0; i< firstAmount; i++) 
  { 
   sideA[i] = ???
  }
}

在我的上一个问题中,我遇到了创建动态数组的问题,这是我的下一步问题! :d
这种方法的主教,骑士等通过类型 其实我现在不明白如何初始化对象。我不能只键入sideA [i] = new first.GetType()(构造函数参数)并理解为什么,但我不明白如何解决这个问题

2 个答案:

答案 0 :(得分:4)

这是非常非常糟糕的设计。

我认为您的方法Battle可能是类Game的实例方法,您没有提供给我们。

然后我强烈建议Battle方法不应该创建它使用的对象的实例。它应该只接受它们并进行战斗行动(计算生命等)。

因此,在其他地方创建这些对象,然后将它们发布到方法中。

class Game
{
    List<Bishop> bishops = new List<Bishop>() { new Bishop(..), ... };
    List<Knight> knights = new List<Knight>() { new Knight(..), ... };

    void Battle(List<Unit> first, List<Unit> second)
    {
        foreach(var f in first)
        {
            // get random unit from the second collection and attack him
            f.Attack(GetRandomKnight(second)); 
        }
    }

    public void StartBattle()
    {
        Battle(bishop, knights);
    }
}

还要确保使用正确的C#命名。类的名称应以大写字母开头。

class Unit
{
    public virtual void Attack(Unit enemy)
    {
        // default attack
        Kick(enemy);
    }

    protected Kick(Unit enemy) { ... }
}

class Bishop : Unit { }

答案 1 :(得分:2)

Ondrej有一个很好的答案。只是为了帮助您使用数组,除非有充分的理由,否则不应该使用反射。我认为你没有理由在这里做这件事。您可以使用典型的new关键字来实例化数组。

void Battle(unit first, unit second, byte firstAmount, byte secondAmount)
{
  var sideA = new unit[firstAmount];
  for(int i=0; i< sideA.Length; i++) 
  { 
    sideA[i] = ???
  }
}

如果实例化的数组实际上应该是first的运行时类型,那么你可以依赖于泛型。

void Battle<T1, T2>(T1 first, T2 second, byte firstAmount, byte secondAmount) 
                   where T1 : unit where T2 : unit
{
  var sideA = new T1[firstAmount];
  for(int i=0; i< sideA.Length; i++) 
  { 
    sideA[i] = ???
  }
}

解决问题的完全动态方式是SetValueGetValue

void Battle(unit first, unit second, byte firstAmount, byte secondAmount)
{
  var sideA = Array.CreateInstance(first.GetType(),firstAmount);
  for(int i=0; i< firstAmount; i++) 
  { 
   sideA.SetValue(???, i);
   sideA.GetValue(i); //to get the value back.
  }
}

基本上你没有获得System.Array的索引器语法。