我想创建一个根据参数返回新对象的函数,例如:
基类:
class BaseClass
{
public int x;
}
第一课:
class TestClassOne: BaseClass
{
public TestClassOne()
{
this.x = 1;
}
}
第二类:
class TestClassTwo: BaseClass
{
public TestClassOne()
{
this.x = 2;
}
}
主:
static void Main(string[] args)
{
BaseClass bc = GetConstructor("TestClassOne");
Console.WriteLine(bc.x); //Prints 1
}
static BaseClass GetConstructor(string className)
{
if(className.Equals("TestClassOne"))
{
return new TestClassOne();
}
else if(className.Equals("TestClassTwo"))
{
return new TestClassTwo();
}
return null;
}
我编写的代码运行良好,问题是我将有很多派生类,如TestClassThree,TestClassFour ... TestClassThousand。 如何在没有else或switch case等的情况下创建一个返回正确构造函数的函数? 我认为反思是一个不错的选择,但我不确定如何使用它。 谢谢!
答案 0 :(得分:1)
最好是你可以在René的答案中使用泛型方法,但是你使用的是字符串,所以看起来并不是这样。
有两个步骤:
这是必要的最小代码:
Type t = Assembly.GetExecutingAssembly().GetType("SO.BaseClass");
object o = Activator.CreateInstance(t);
如您所见,您需要知道该类型的程序集和命名空间,否则您将需要对其中任何一个进行模糊匹配。
答案 1 :(得分:0)
我会对你的实施提出一个警告。你试图做的是一个工厂。考虑到您要为基类添加依赖项,您将仅限于允许具有该基类的构造函数。如果您需要某些类具有不同的基类但通过相同的方法提供,则需要共享一个接口。像其他人建议的那样,你可以使用泛型。这是一个没有泛型的例子:
public static IMyInterface GetMatchingClass(string className)
{
Type t = Type.GetType(className);
return (IMyInterface)Activator.CreateInstance(t);
}
只要您返回的类实现给定的接口,所有都是peachy。