C# 从字符串实例化继承的类

C# 从字符串实例化继承的类,c#,oop,inheritance,C#,Oop,Inheritance,我想知道是否有一种简单的方法来实例化继承的对象(知道类名) 假设我有 public abstract Monster{ public string name; public string specie; public Stats baseStats; public string imgDir; } 及 我的目标是从保存的文件中加载怪物,仅使用一个物种进行测试,我执行以下操作: Monster[0] = new Specie1("foo"); 但是如果我有很多物

我想知道是否有一种简单的方法来实例化继承的对象(知道类名)

假设我有

public abstract Monster{
    public string name;
    public string specie;
    public Stats baseStats;
    public string imgDir;
}

我的目标是从保存的文件中加载怪物,仅使用一个物种进行测试,我执行以下操作:

Monster[0] = new Specie1("foo");
但是如果我有很多物种,有没有一种方法可以通用地实例化

例如:

string specie = loadSpecie();
Monster[] = new specie("foo");
我希望有一种方法可以做到这一点,而不必在任何地方创建大量开关和ifs

我在考虑创建一个构造函数

Monster(string species,string name){
    if(species == "Specie1"){
        return new Specie1(name);
    }
}

但我认为这将是一个可怕的编程,而且根本不可伸缩。

您可以使用工厂方法来实例monster子类

public abstract Monster
{
    public string name;
    public string specie;
    public Stats baseStats;
    public string imgDir;

    public static Monster CreateMonster(string monster)
    {
        Type[] types = GetTypeInfo().Assembly.GetTypes();
        Type monsterType = types.FirstOrDefault(t => t.Name.ToLower().Equals(monster.ToLower()));

        if (monsterType == null)
            throw new InvalidOperationException("The given monster does not have a Type associated with it.");

        return Activator.CreateInstance(monsterType) as Monster;
    }
}

public class Cat : Monster
{
}
CreateMonster
方法查找当前程序集中的所有类型,并创建它找到的第一个类型的实例,该实例的名称与提供的monster名称匹配。您可能希望包含一些逻辑,这样它就不会试图实例化一个抽象类,并确保该类型实际上是
Monster的子类。

就我个人而言,我可能会用一个属性来装饰monster子类,该属性为每个类提供一个友好的名称。我会将属性值保存到文件中,并保存到第一个具有与怪物名称匹配的属性的类型中。我也只执行一次
GetTypes()
调用。您应该将结果缓存在Monster类的私有静态字段中。这样,您只需使用一次反射。在任何情况下,上述代码都可以正常工作,并且可以这样使用:

Monster cat = Monster.CreateMonster("Cat");

派生类是否只为变量设置不同的值?在这种情况下,只需对怪物类进行多个实例并设置属性……这是一个通用工厂方法的主要候选。只要你不需要实例化一个泛型的“怪物”(即不是派生类之一),这将是更好的练习。@LeandroLibarona我将你的问题回滚到它的原始状态。由于问题的答案是有标记的,因此没有必要在问题中包含解决方案。那些展望未来的人将看到有标记的答案和解决方案。我们希望保持问题本身的干净性和易读性,以供那些在未来寻找与他们的问题相匹配的解决方案的人使用。卓越!!!几乎没有任何修改,我已经在unity3d上顺利运行了!
Monster cat = Monster.CreateMonster("Cat");