11

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

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

我的问题是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>();
    }
}

但是,我无法找到如何传递该“真实”参数以使其接受非公共构造函数(内部)。

我错过了什么还是不可能的?

4

3 回答 3

21

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

public class GenericFactory<T> where T : MyAbstractType
{
    public static T GetInstance()
    {
        return Activator.CreateInstance(typeof(T), true);
    }
}

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

于 2008-09-11T19:48:43.373 回答
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 作为所有工厂的基类,而不是从头开始编写每个工厂,对吗?

于 2008-09-11T19:53:40.443 回答
0

除了 Activator.CreateInstance(typeof(T), true) 工作,T 应该有默认构造函数

于 2010-06-13T12:54:58.813 回答