[英]C# function that returns type according to a parameter
我想创建一个根据参数返回新对象的函数,例如:
基类:
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)时。 我如何制作一个返回正确构造函数的函数,而无需if if else或switch case等? 我认为反射将是一个不错的选择,但我不确定如何使用它。 谢谢!
最好是可以使用通用方法,例如在René的答案中,但是您使用的是字符串,所以事实并非如此。
分两个步骤:
这是必需的最少代码:
Type t = Assembly.GetExecutingAssembly().GetType("SO.BaseClass");
object o = Activator.CreateInstance(t);
如您所见,您需要知道类型的程序集和名称空间,否则您将必须对两者进行模糊匹配。
对于您的实施情况,我会提请注意。 您试图做的事情叫做工厂。 考虑到要为基类添加依赖项这一事实,您将被限制为仅允许具有该基类的构造函数。 如果曾经需要某些类具有不同的基类,但是通过相同的方法提供,则需要共享一个接口。 就像其他人建议的那样,您可以使用泛型。 这是一个没有泛型的示例:
public static IMyInterface GetMatchingClass(string className)
{
Type t = Type.GetType(className);
return (IMyInterface)Activator.CreateInstance(t);
}
只要您返回的类都实现给定的接口,一切都是桃红色的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.