不,这不是关于泛型的问题。
我有一个带有内部构造函数的几个类的工厂模式(如果没有通过工厂,我不希望它们被实例化。)
我的问题是CreateInstance
失败了“没有为此对象定义的无参数构造函数”错误,除非我在非公共参数上传递“true”。
实施例
// Fails
Activator.CreateInstance(type);
// Works
Activator.CreateInstance(type, true);
我想让工厂变得通用,使其更简单,如下所示:
public class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return Activator.CreateInstance<T>();
}
}
但是,我无法找到如何传递“true”参数来接受非公共构造函数(内部)。
我错过了什么或不可能吗?
答案 0 :(得分:21)
为了解决这个问题,你不能只改变你的用法:
public class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return Activator.CreateInstance(typeof(T), true);
}
}
您的工厂方法仍然是通用的,但对激活器的调用不会使用泛型过载。但是你仍然应该达到同样的效果。
答案 1 :(得分:3)
如果你绝对要求构造函数是私有的,你可以尝试这样的东西:
public abstract class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return (T)Activator.CreateInstance(typeof(T), true);
}
}
否则你最好添加新约束并走这条路线:
public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
public static T GetInstance()
{
return new T;
}
}
您是否尝试将GenericFactory用作所有工厂的基类,而不是从头开始编写每个工厂?
答案 2 :(得分:0)
除了Activator.CreateInstance(typeof(T),true)工作之外,T应该有默认构造函数