首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Activator.CreateInstance(string)和Activator.CreateInstance<T>()的区别

Activator.CreateInstance(string)和Activator.CreateInstance<T>()的区别
EN

Stack Overflow用户
提问于 2008-09-11 19:42:34
回答 3查看 21.3K关注 0票数 11

不,这不是一个关于泛型的问题。

我有一个工厂模式,有几个带有内部构造函数的类(如果不是通过工厂,我不希望它们被实例化)。

我的问题是,除非我在非公共参数上传递"true“,否则CreateInstance会失败,并显示”没有为此对象定义无参数构造函数“错误。

示例

代码语言:javascript
复制
// Fails
Activator.CreateInstance(type);

// Works
Activator.CreateInstance(type, true);

我想让工厂泛型更简单一点,就像这样:

代码语言:javascript
复制
public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance<T>();
    }
}

但是,我无法找到如何传递"true“参数以便它接受非公共构造函数(内部)。

我是不是错过了什么,或者这是不可能的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-09-11 19:48:43

为了解决这个问题,你不能这样改变你的用法吗:

代码语言:javascript
复制
public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance(typeof(T), true);
    }
}

工厂方法仍然是泛型的,但是对激活器的调用不会使用泛型重载。但您仍然应该获得相同的结果。

票数 21
EN

Stack Overflow用户

发布于 2008-09-11 19:53:40

如果你绝对要求构造函数是私有的,你可以尝试这样做:

代码语言:javascript
复制
public abstract class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return (T)Activator.CreateInstance(typeof(T), true);
    }
}

否则,您最好添加新的约束并执行该路线:

代码语言:javascript
复制
public abstract class GenericFactory<T> where T : MyAbstractType, new()
{
    public static T GetInstance()
    {
        return new T;
    }
}

您正在尝试使用GenericFactory作为所有工厂的基类,而不是从头开始编写每个工厂,对吗?

票数 3
EN

Stack Overflow用户

发布于 2010-06-13 20:54:59

除了要使用Activator.CreateInstance(typeof(T),true)之外,T还应该有默认构造函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档