繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM