Как часть попытки предложить ответ на другой вопрос, я хотел создать Dictionary
саморегистрационных экземпляров Singleton. В частности, что-то вроде этого:Яркая загрузка и хранение Singleton
public abstract class Role
{
public static Dictionary<string, Role> Roles = new Dictionary<string, Role>();
protected Role()
{
_roles.Add(this.Name, this);
}
public abstract string Name { get; }
}
public class AdminRole : Role
{
public static readonly AdminRole Instance = new AdminRole();
public override string Name { get { return "Admin"; } }
}
Однако AdminRole
конструктор не вызывается, если я не доступ Instance
, поэтому он не добавляется к Roles
словаря. Я знаю, что могу просто создать словарь, используя { AdminRole.Instance.Name, Admin Role}
, но я бы хотел добавить новые роли, чтобы не менять класс Role
.
Любые предложения? Это даже хороший дизайн для доступа к синглтонам по строке?
Строка кода, чтобы проверить результат является:
var role = Role.Roles["Admin"];
Это успешным, если вы не получите KeyNotFound
исключение (или null
).
Там может быть явной инициализацией Role
(например, Role.Initialize()
), но не подклассы - идея, чтобы иметь возможность добавить подкласс поэтому словарь имеет его, не возникает необходимости менять что-либо предварительное существующий.
Причина, по которой вы не хотите менять словарь в 'Role' - вы не хотите вносить изменения в каждый новый подтип или не хотите делать изменения когда-либо? –
@nsinreal - Первый. Я хочу иметь возможность создать новый тип «Роль», не делая ничего более, чем подклассифицируя его. – Bobson
Хорошо, поймите. Reflection –