#c# #interface #generated-code
#c# #интерфейс #сгенерированный код
Вопрос:
Допустим, у нас есть пространство имен под названием AllFoos.
И допустим, что все классы в пространстве имен AllFoos реализуют определенный интерфейс с именем IFoo и все являются синглетонами.
Теперь у нас есть:
HashSet<IFoo> myFoos = new HashSet<IFoo>();
Каким должен быть код для заполнения коллекции MyFoos одноэлементными экземплярами всех классов в AllFoos?
Реализация singleton для всех этих классов является:
private static IFoo _instance = new ConcreteImplementationOfFoo1();
public static IFoo Instance
{
get
{
return _instance;
}
}
Комментарии:
1. Почему, во имя $ deity, вы хотите это сделать?
2. Не является ли коллекция одиночек своего рода противоречием? Синглтон, по определению, является одним объектом, но вам нужна их коллекция.
3. Я взял из вопроса, что существует несколько классов, каждый из которых одноэлементный.
4. На самом деле, Роберт, синглтон означает, что существует только один ЭКЗЕМПЛЯР определенного объекта. Я полагаю, что в этом случае OP ищет несколько одноэлементных объектов, каждый из которых может иметь не более одного экземпляра
5. Я думаю, вы могли бы использовать отражение, чтобы получить все классы внутри пространства имен и создавать их один за другим
Ответ №1:
Если бы вы использовали платформу внедрения зависимостей, вы могли бы:
- зарегистрируйте свои классы как «singleton» в контейнере
- легко зарегистрировать все реализации (хорошие фреймворки допускают массовую регистрацию на основе некоторых шаблонов)
- разрешите все реализации вашего интерфейса в виде списка
Если вы хотите пойти классическим путем, вы должны указать, как выглядит ваш шаблон singleton (например, свойство static Instance?), и это может быть решено с помощью классического отражения, как уже упоминалось в комментариях.