C#函数根据参数返回类型

时间:2017-06-22 12:51:03

标签: c# reflection

我想创建一个根据参数返回新对象的函数,例如:

基类:

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等的情况下创建一个返回正确构造函数的函数? 我认为反思是一个不错的选择,但我不确定如何使用它。 谢谢!

2 个答案:

答案 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。