Как сделать универсальный синглтон базовый класс C#

Я пытаюсь создать общий базовый класс синглтона, как

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 class Test : SingletonBase<Test>
{
    public void A()
    {

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

Ошибка компиляции:

'Test' должен быть неабстрактным типом с открытым конструктором без параметров, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'Test'

Как мне этого добиться?

2 ответа

Решение

Проблема в вашем общем ограничении where T : class, new(), new() для ограничения требуется открытый конструктор без параметров в T. Обойти это невозможно; вам нужно предоставить такой конструктор в Permission Controller,

Я бы избежал такого рода рекурсивных шаблонов. Прочитайте этот пост в блоге для подробного объяснения модели и причин не использовать его.

Насколько я могу судить, вам не нужно иметь подклассы 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>; }
    }
}
Другие вопросы по тегам