根据用户输入创建对象

时间:2018-09-28 09:57:35

标签: c#

我有基类Animal,我创建了许多继承自它的类,例如DogCatMonkey ...现在我想实现基于用户输入的功能,根据输入创建对象,以便我可以在其中运行覆盖版本功能。像这样:

//Animal.cs
abstract class Animal
{
    protected abstract void Func()
}

//Dog(or other animal).cs
class Dog:Animal
{
    protected override void Func() {Do something;}
}

//program.cs
public static void main()
{
    Animal a = null;
    string str = Console.ReadLine();
    a = "new str()"; // should have some try-catch module, omit here       
}

我有成百上千的动物,因此使用ifswitch似乎不是一个好的解决方案;有什么好的方法吗?

1 个答案:

答案 0 :(得分:4)

做到这一点的一种方法是在运行时使用使用反射的工厂。它不是最整洁的方法,但是可以避免您不得不使用if语句。

 public static class AnimalFactory
{
    public static Animal Create(string animalName)
    {
        var type = Type.GetType(typeof(Animal).Namespace + "." + animalName, throwOnError: false);

        if (type == null)
        {
            throw new InvalidOperationException(animalName.ToString() + " is not a known Animal type");
        }

        if (!typeof(Animal).IsAssignableFrom(type))
        {
            throw new InvalidOperationException(type.Name + " does not inherit from Animal");
        }

        return (Animal)Activator.CreateInstance(type);
    }
}

根据您的命名空间,它将使用反射创建动物的实例。您可以从用户输入中输入动物名称。

然后使用

进行调用
var type = AnimalFactory.Create("dog");