Я думаю, у вас есть небольшое замешательство относительно того, что означают шаблоны проектирования.
Шаблон - это действительно обычный способ ведения дел, предназначенный для решения конкретной проблемы .
Вы действительно не используете шаблоны для шаблонов.Использование большего количества шаблонов автоматически не означает хорошее.Вы используете шаблон для решения проблемы типа - и, надеюсь, этот шаблон является признанным наилучшим способом решения этой проблемы.Не пытайтесь применить шаблон к своему коду, потому что вы можете .
Теперь, после всего этого, действительно можно увидеть, что то, что вы планируете делать, не является правильным способомидти о реализации шаблона (ов).Вы не помечаете код атрибутами и т. Д., А затем называете их шаблонами.Шаблон - это ваш код.Ваш код является шаблоном.Например, вы не помечаете шаблон издателя / подписчика в классе, если он действительно не реализует функции публикации / подписки.Например, вы не помечаете класс «Singleton», и тогда он становится одноэлементным шаблоном;использование шаблона Singleton требует от вас кодирования вашей программы (и ваших классов) вокруг этого дизайна.
Однако вы можете пометить код или классы определенными атрибутами, которые могут помочь в проверка , соответствует ли код / классы определенному шаблону.
Например, вы можете реализовать средство проверки типов, которое проходит через весь ваш класс, проверить, помечено ли что-либо как «издатель», и посмотреть, является ли этот классреализует интерфейс "IPublisher"Или ваша программа проверки типов может проверить, помечен ли какой-либо класс как «Синглтон», позволяет ли конструктор создавать более одного экземпляра одновременно.
Но атрибуты и отражение обычно не являются инструментами для реализовать шаблон.
В C #, где нет множественного наследования, способ реализации шаблонов иногда только через базовый класс.Например, вы можете реализовать шаблон «singleton», объявив базовый класс «SingletonObject», который ограничивается только одним экземпляром.Затем вы выводите из этого базового класса любой класс, которым хотите быть в одиночку.Например, вы можете реализовать шаблон «публикация / подписка», объявив интерфейсы IPublisher и ISubscriber.
Теперь, если вы действительно хотите просто использовать шаблон Decorator в классах C # (согласно заголовку вашего вопроса)), то, что вы ищете, это автоматический генератор объектов-оболочек.Вы можете основывать свою обертку на ExpandoObject, проходить через свойства базового объекта и добавлять свойства в ExpandoObject, который просто делегирует обратно базовому объекту.Затем добавьте новые свойства в ExpandoObject поверх вашего базового объекта.Вуаля!Вы получаете генератор классов-оболочек auto-Decorator-Pattern.