gpt4 book ai didi

c# - 在 C# 中返回一个随机类型的对象

转载 作者:行者123 更新时间:2023-12-03 23:17:52 24 4
gpt4 key购买 nike

我有一个工厂类,我希望它能够返回一个随机类型的对象。该类型应从预定义的类型列表中选择。所以,像这样:

    public class NeutralFactory : NPCFactory
{
private List<Type> humanoids = new List<Type> { typeof(Dwarf), typeof(Fairy), typeof(Elf), typeof(Troll), typeof(Orc) };
private Random random = new Random();
public Creature CreateHumanoid(int hp = 100)
{
int index = random.Next(humanoids.Count);
return new humanoids[index]();
}
}

遗憾的是,这不起作用。
我希望能够将参数传递给构造函数,我们可以假设它们都具有相同的签名。

我发现唯一可行的方法是使用 switch 语句并在每种情况下返回不同的对象:

        public Creature CreateHumanoid(int hp = 100)
{
int index = random.Next(humanoids.Count);
switch (index)
{
case 0:
return new Dwarf(hp);
case 2:
return new Fairy(hp);
case 3:
return new Elf(hp);
case 4:
return new Troll(hp);
case 5:
return new Orc(hp);
default:
throw new Exception("This should not execute.");
}

}

虽然我不太喜欢它。有更好的方法吗?

编辑:
这是我最终使用的:

        private List<Func<int, string, Creature>> humanoids = new List<Func<int, string, Creature>> {
(hp, name) => new Fairy(hp, name),
(hp, name) => new Troll(hp, name),
};

private List<Func<int, Creature>> animals = new List<Func<int, Creature>> {

(hp) => new Wolf(hp)
};

public override Creature CreateHumanoid(int hp = 100, string name = null)
{
int index = random.Next(humanoids.Count);
return humanoids[index](hp, name);
}

public override Creature CreateAnimal(int hp = 100)
{
int index = random.Next(animals.Count);
return animals[index](hp);
}

我发现了类似的问题,其中使用了 () => function() 语法,但我不明白,我猜这些是某种临时委托(delegate)?无论如何,它如我所愿地工作并且非常简洁。

对于 future 的读者,这里有一个关于 Func 的有用的 MSDN 页面:
https://learn.microsoft.com/en-us/dotnet/api/system.func-2?view=netframework-4.8

最佳答案

您可以在列表中排序函数。

public class NeutralFactory: NPCFactory
{
private List<Func<int, Creature>> humanoids = new List<Func<int, Creature>> {
hp=> new Dwarf(hp),
hp=> new Fairy(hp),
hp=> new Elf(hp),
hp=> new Troll(hp),
hp=> new Orc(hp)
};
private Random random = new Random();

public Creature CreateHumanoid(int hp = 100)
{
int index = random.Next(humanoids.Count);
return humanoids[index](hp);
}
}

关于c# - 在 C# 中返回一个随机类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60998181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com