我有一个抽象基类和派生类。我们称他们为Base
和Derived
。
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
,这也是不幸的。在这种情况下,我可以轻松地使用枚举而不是类型参数。
我想知道是否有更好的方法来实现我的目标?
答案 0 :(得分:4)
您可以使用Activator创建实例:
public static T Create<T>(int number) where T : Base
{
return (T) Activator.CreateInstance(typeof (T), number);
}
在这种情况下,如果创建新的派生类,则无需更新方法。这假设您总是有一个构造函数,它接受一个整数参数。如果这样的构造函数不存在,您将获得运行时异常。