Сразу говорю — недостатки использования таких классов в качестве синглетонов мне известны, вопрос не о них.
Есть такой класс:
public class Singleton<T> where T : Singleton<T>, new()
{
protected static readonly object lock_obj = new Object();
protected static T _Instance = null;
public static T Instance
{
get
{
if (_Instance == null)
{
lock (lock_obj)
{
if (_Instance == null)
{
_Instance = new T(); //ВОТ ЗДЕСЬ ПРОБЛЕМА!!! (см. далее)
}
}
}
return _Instance;
}
}
}
Наследуюсь от него:
public class DB:Singleton<DB>
{
protected string _ConnectionString = null;
public DB()
{
_ConnectionString = ...;
}
//+Еще много-много-много методов
}
Теперь требуется создать другой класс DB (с другой _ConnectionString — все остальное то же самое):
public class UserDB:DB
{
public UserDB()
{
_ConnectionString = ...; //ЭТОТ КОД НИКОГДА НЕ ВЫПОЛНЯЕТСЯ!!!
}
}
Т.е. происходит следующее:
1. Вызываю неявно создание экземпляра UserDB:
IDataReader dr=UserDB.ExecuteReader....;
2. В классе Singleton<T> вызывается
_Instance = new T();
НО <T> здесь — это тип DB, а не UserDB как мне надо (хотя вызов идет именно от класса UserDB)
Я понимаю, почему так происходит, подскажите как можно это реализовать.