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

C# 如何初始化动态创建的数组对象?,c#,arrays,initialization,C#,Arrays,Initialization,在我的上一个问题中,我在创建动态数组方面遇到了问题,下面是我的下一步问题!:D 此方法适用于主教、骑士等 实际上,我现在不知道如何初始化对象。我不能键入sideA[I]=new first.GetTypeconstructor参数并理解原因,但我不知道如何解决这个问题这是一个非常非常糟糕的设计 我假设您的方法Battle可能是一个类游戏的实例方法,您没有提供给我们 然后我强烈建议,Battle方法不应该创建它所使用的对象的实例。它应该只采取他们和做一个战斗行动,计算生命等 因此,在别处创建这些对

在我的上一个问题中,我在创建动态数组方面遇到了问题,下面是我的下一步问题!:D 此方法适用于主教、骑士等
实际上,我现在不知道如何初始化对象。我不能键入sideA[I]=new first.GetTypeconstructor参数并理解原因,但我不知道如何解决这个问题这是一个非常非常糟糕的设计

我假设您的方法Battle可能是一个类游戏的实例方法,您没有提供给我们

然后我强烈建议,Battle方法不应该创建它所使用的对象的实例。它应该只采取他们和做一个战斗行动,计算生命等

因此,在别处创建这些对象,然后将它们发布到方法中

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] = ???
  }
}

这是一个非常非常糟糕的设计

我假设您的方法Battle可能是一个类游戏的实例方法,您没有提供给我们

然后我强烈建议,Battle方法不应该创建它所使用的对象的实例。它应该只采取他们和做一个战斗行动,计算生命等

因此,在别处创建这些对象,然后将它们发布到方法中

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] = ???
  }
}

昂德雷有一个很好的答案。为了帮助您使用数组,除非有充分的理由,否则永远不要使用反射。我看不出你有什么理由在这里这么做。您可以使用典型的new关键字来实例化数组

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

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

class Bishop : Unit { }
解决问题的完全动态方式是SetValue和GetValue:


基本上你不会得到System.Array的索引器语法。

Ondrej有一个很好的答案。为了帮助您使用数组,除非有充分的理由,否则永远不要使用反射。我看不出你有什么理由在这里这么做。您可以使用典型的new关键字来实例化数组

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

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

class Bishop : Unit { }
解决问题的完全动态方式是SetValue和GetValue:


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

你确定你的代码是C语言吗?具有第一个字母的小类和独立函数…您使用的是哪种编程语言???@Kyle C,命名风格不好,请查看System.Array.CreateInstanceAre?您应该创建一个名为figure的基本接口,让我们根据由chess figures命名的其他类创建figure,然后让其他类实现该接口。这允许你将任何图形作为参数传递。感谢批评,我一定会学习C命名约定!这段代码只是我案例的一个模型你确定你的代码是C语言吗?具有第一个字母的小类和独立函数…您使用的是哪种编程语言???@Kyle C,命名风格不好,请查看System.Array.CreateInstanceAre?您应该创建一个名为figure的基本接口,让我们根据由chess figures命名的其他类创建figure,然后让其他类实现该接口。这允许你将任何图形作为参数传递。感谢批评,我一定会学习C命名约定!这段代码只是我的case+1泛型示例的一个模型。。。也谢谢你修改我的博文+1的泛型样本。。。也谢谢你修改我的帖子
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] = ???
  }
}
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.
  }
}