在其他地方创建的通用类

时间:2014-03-30 10:45:26

标签: c# design-patterns

我有自己的(简单,没有线程安全)通用单例类,如下所示:

public class GenericSingleton<T> where T : class
{
    private static T uniqueInstance = null;
    private GenericSingleton() { }

    public static T getInstance()
    {
        if (uniqueInstance == null)
        {
            Type t = typeof(T);
            uniqueInstance = (T)Activator.CreateInstance(t);

        }
        return uniqueInstance;
    }

}

在其他课程中,我想创建我的泛型类:

public class GenericFactory
{
    public object CreateObject(string TypeName, bool IsSingleton, params object[] Parameters)
    {
        if (IsSingleton)
        {
            Type genericType = typeof(GenericSingleton<>);
            Type typeArgs =  Type.GetType(TypeName);
            Type GenSinType = genericType.MakeGenericType(typeArgs);
            object o = Activator.CreateInstance(GenSinType);
            return o;
        }
        else
        {
            return Activator.CreateInstance(Type.GetType(TypeName), Parameters);
        }

    }

如果我按

使用它,它正在工作
 GenericFactory gf = new GenericFactory();
    List<int> w = (List<int>)gf.CreateObject("System.Collections.Generic.List`1[System.Int32]", false, new int[] { 10, 22 });
            Console.WriteLine(w[1]+w[0]);
            Console.WriteLine(w.GetType());

不幸的是,如果我这样做

object test = gf.CreateObject("System.String", true, 7);

我得到了保证:

  

“System.MissingMethodException”类型的未处理异常   发生在mscorlib.dll

     

其他信息:找不到类型为“System.String”的构造函数。

此外,如果我使用它来创建通用单例,例如:

List<int> ww = (List<int>)gf.CreateObject("System.Collections.Generic.List`1[System.Int32]", true, new int[] { 10, 22 });

我有下一个例外:

  

“System.MissingMethodException”类型的未处理异常   发生在mscorlib.dll

     

附加信息:没有为此定义无参数构造函数   对象

你能告诉我出了什么问题吗?我怎样才能做得更好?

1 个答案:

答案 0 :(得分:1)

问题在于这一行:

object o = Activator.CreateInstance(GenSinType);

您正在尝试创建单例类的实例,但单例模式的重点是您不能从类本身外部执行此操作。您将构造函数设为私有,因此Activator无法访问它

您可能想要做的是,代替该行,调用泛型类型的静态方法。有关示例,请参阅this question

一般来说,通过要求您可以从其名称的字符串表示形式而不是实际类型对象中获取类型的实例,您自己的生活将变得非常困难。除非它真的很重要,否则你应该尽量不这样做。