Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:从已知数量的构造函数中调用随机构造函数的聪明方法是什么?_C#_Constructor - Fatal编程技术网

C#:从已知数量的构造函数中调用随机构造函数的聪明方法是什么?

C#:从已知数量的构造函数中调用随机构造函数的聪明方法是什么?,c#,constructor,C#,Constructor,在我的游戏中,我有不同的敌人。当我创建一个地牢时,我希望游戏随机决定从玩家的角度放置哪个敌人。每个敌人都有自己的构造器,例如: Ogre Ogre1 = new Ogre(level 1); 我用我在别处定义的方法称之为与敌人的战斗 fight(enemy); 现在我知道我可以通过如下方式调用随机构造函数: int i = new Random.Next(1,5) 然后这个: if (i= 1) {Ogre Ogre1 = new Ogre(level 1); Fight(Ogre1);

在我的游戏中,我有不同的敌人。当我创建一个地牢时,我希望游戏随机决定从玩家的角度放置哪个敌人。每个敌人都有自己的构造器,例如:

Ogre Ogre1 = new Ogre(level 1);
我用我在别处定义的方法称之为与敌人的战斗

fight(enemy);
现在我知道我可以通过如下方式调用随机构造函数:

int i = new Random.Next(1,5)
然后这个:

if (i= 1)
{Ogre Ogre1 = new Ogre(level 1);
Fight(Ogre1);
}

else if (i=2)
{ Skeleton Skeleton 1 = new Skeleton (level 1);
....
但是,假设我最终会有相当多的敌人,这看起来相当乏味。 有没有更聪明的方法可以做到这一点,例如,我可以将可能的敌人存储在列表中,然后从列表中调用构造函数

编辑:下面的答案似乎正是我所需要的!奇怪的是,只有当我输入lambda表达式时,如果我尝试直接实现解决方案,它才会起作用:

    static Func<int, Enemy>[] EnemyFactory = new[] 
    {
        (level) => (Enemy) new Ogre(level),
        (level) => (Enemy) new Skeleton(level)
    };
static Func[]EnemyFactory=new[]
{
(等级)=>(敌人)新食人魔(等级),
(关卡)=>(敌人)新骨架(关卡)
};
我得到错误代码CS0826,隐式类型数组找不到最佳类型

但是如果我输入lambda函数,它会突然起作用

        static Func<int, Enemy>[] EnemyFactory = new Func<int, Enemy>[] 
    {
        (level) => (Enemy) new Ogre(level),
        (level) => (Enemy) new Skeleton(level)
    };
static Func[]EnemyFactory=new Func[]
{
(等级)=>(敌人)新食人魔(等级),
(关卡)=>(敌人)新骨架(关卡)
};
制作一个
Func
类型的“敌方工厂”数组,并从该数组中随机选取一个工厂

以下是一个潜在实现的框架:

interface IEnemy ...
class Ogre : IEnemy ...
class Skeleton : IEnemy ...

static Func<IEnemy>[] EnemyFactory = new Func<IEnemy>[] {
    () => (IEnemy)new Ogre()
,   () => (IEnemy)new Skeleton()
,   ...
};

一般来说,你想要一个工厂来制造你的敌人,从那以后,你可以根据需要将其复杂化。听起来像是一个x-y问题。谢谢你的回复,谢尔盖!奇怪的是,只有当我按编辑中所示键入lambda函数时,它才对我有效。你能看看这个,告诉我我的第一个实现有什么问题吗?@Max我猜C#编译器不够严格,无法从函数定义派生出公共类型。它需要将类型从
EnemyFactory
的声明传播到它的成员定义中,而C#标准不允许这样做,至少目前是这样。
static Func<Level,IEnemy>[] EnemyFactory = new Func<Level,IEnemy>[] {
    (level) => (IEnemy)new Ogre(level)
,   (level) => (IEnemy)new Skeleton(level)
,   ...
};