如何制作通用的单例基类C#

时间:2013-03-25 04:06:10

标签: c# generics singleton

我正在尝试创建像

这样的通用单例基类
public class SingletonBase<T> where T : class, new()
{
    private static object lockingObject = new object();
    private static T singleTonObject;
    protected SingletonBase()
    {

    }

    public static T Instance
    {
        get
        {
            return InstanceCreation();
        }
    }
    public static T InstanceCreation()
    {
        if(singleTonObject == null)
        {
             lock (lockingObject)
             {
                  if(singleTonObject == null)
                  {
                       singleTonObject = new T();
                  }
             }
        }
        return singleTonObject;
    }
}

但我必须在派生的中将构造函数设为public。

public class Test : SingletonBase<Test>
{
    public void A()
    {

    }
    private Test()
        : base()
    { }
}

编译错误:

  

&#39;测试&#39;必须是具有公共无参数构造函数的非抽象类型才能将其用作参数&#39; T&#39;通用类型或方法&#39;测试&#39;

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:6)

问题是您的通用约束where T : class, new()new()约束需要T上的公共无参数构造函数。没有办法解决这个问题;你需要在Permission Controller中提供这样的构造函数。

答案 1 :(得分:3)

我会避免这种递归的通用模式。请阅读此this blog post以获取使用它的模式和原因的详细说明。

据我所知,您不需要SingletonBase<T>的任何子类。我看不到SingletonBase<T>的子类能够添加到您的代码中的任何内容。我只想把它重写为

public static class Singleton<T> where T : class, new()
{
    ...
}

然后您可以将其用作

var test = Singleton<Test>.Instance;

如果您希望能够将Test用作单身人士,请将其设为

public class Test 
{
    public static T Instance
    {
        get { return Singleton.Instance<Test>; }
    }
}