Activator.CreateInstance(string) 和 Activator.CreateInstance<T>() 区别
-
09-06-2019 - |
题
不,这不是关于泛型的问题。
我有一个工厂模式,其中有几个带有内部构造函数的类(如果不是通过工厂,我不希望它们被实例化)。
我的问题是 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”参数以使其接受非公共构造函数(内部)。
我错过了什么还是不可能的?
解决方案
为了解决这个问题,你不能像这样改变你的用法吗:
public class GenericFactory<T> where T : MyAbstractType
{
public static T GetInstance()
{
return Activator.CreateInstance(typeof(T), true);
}
}
您的工厂方法仍然是通用的,但对激活器的调用将不会使用通用重载。但您仍然应该获得相同的结果。
其他提示
如果你绝对要求构造函数是私有的,你可以尝试这样的事情:
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 作为所有工厂的基类,而不是从头开始编写每个工厂,对吧?
除了 Activator.CreateInstance(typeof(T), true) 工作之外,T 应该有默认构造函数
不隶属于 StackOverflow