使用带有type参数的工厂方法使用参数化构造函数创建派生类

时间:2014-09-20 06:54:34

标签: c# generics polymorphism

我有一个抽象基类和派生类。我们称他们为BaseDerived

Base有构造函数:

public Base(int number)
{
    // do something with number
}

并且Derived总是具有构造函数(even though this cannot be ensured through an interface,这在我的程序中就是这样):

public Derived(int number) : base(number)
{
    // do some other stuff
}

现在,我想要一个工厂方法来创建从Base派生的对象,应该像这样调用:

Base.Create<Derived>(someNumber);

但我不知道如何以正确的方式实现此方法。我认为最优雅的解决方案是做这样的事情:

public static T Create<T>(int number) where T : Base, new(int)
{
    return new T(number);
}

但似乎C# does not support the parameterized constructor constraint new(int)只是无参数的。这个解决方案本来就很清楚,它完全表达了我想要的东西。哦,好吧..

相反,我基本上可以打开type参数并创建正确类型的实例,如下所示:

public static Base Create<T>(int number) where T : Base, new(int)
{
    if (typeof(T) == typeof(Derived))
    {
        return new Derived(number);
    }
    // and so on for all other derived types
}

但这需要我每次创建一个新的派生类时更新方法,这是不幸的。此外,typeof(T) == typeof(Derived)似乎过于苛刻。此外,使用这种方法,似乎工厂方法的返回类型必须是Base而不是T,这也是不幸的。在这种情况下,我可以轻松地使用枚举而不是类型参数。

我想知道是否有更好的方法来实现我的目标?

1 个答案:

答案 0 :(得分:4)

您可以使用Activator创建实例:

public static T Create<T>(int number) where T : Base
{
    return (T) Activator.CreateInstance(typeof (T), number);
}

在这种情况下,如果创建新的派生类,则无需更新方法。这假设您总是有一个构造函数,它接受一个整数参数。如果这样的构造函数不存在,您将获得运行时异常。