Как создать коллекцию одиночек из всех классов в пространстве имен

#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:

Если бы вы использовали платформу внедрения зависимостей, вы могли бы:

  1. зарегистрируйте свои классы как «singleton» в контейнере
  2. легко зарегистрировать все реализации (хорошие фреймворки допускают массовую регистрацию на основе некоторых шаблонов)
  3. разрешите все реализации вашего интерфейса в виде списка

Если вы хотите пойти классическим путем, вы должны указать, как выглядит ваш шаблон singleton (например, свойство static Instance?), и это может быть решено с помощью классического отражения, как уже упоминалось в комментариях.