我有基类Animal
,我创建了许多继承自它的类,例如Dog
,Cat
,Monkey
...现在我想实现基于用户输入的功能,根据输入创建对象,以便我可以在其中运行覆盖版本功能。像这样:
//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
}
我有成百上千的动物,因此使用if
或switch
似乎不是一个好的解决方案;有什么好的方法吗?
答案 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");