Как класс сущности, я хочу добавить атрибуты во время выполнения, как мне это сделать?
С#: Как добавить атрибуты к объекту во время выполнения?
Ответ 1
Что нужно видеть в атрибутах? Если это такие вещи, как привязка данных и т.д., TypeDescriptor
должен работать:
TypeDescriptor.AddAttributes(type, attribs);
TypeDescriptor.AddAttributes(instance, attribs);
Это влияет только на использование System.ComponentModel
(а не прямое отражение), но это довольно часто - например, вы можете связать TypeConverter
с помощью вышеперечисленного.
Если под "атрибутами" вы подразумеваете "свойства", то (опять же, что касается привязки данных) TypeDescriptor
также имеет потенциал там, но он нетривиальен; вам нужно либо реализовать ICustomTypeDescriptor
для объекта, либо написать CustomTypeDescriptor
для типа - и в любом случае вам нужно написать свою собственную реализацию PropertyDescriptor
(часто разговаривая с словарем для экземпляра и т.д.). Это будет использоваться все, что использует:
// only works if you use TypeDescriptionProvider
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type);
// works via TypeDescriptionProvider or ICustomTypeDescriptor
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj);
Опять же, это охватывает широкий диапазон привязки данных и аналогичные сценарии. Например, см. Здесь - однако это далеко не тривиально. Пример использования (по ссылке) добавляет два свойства во время выполнения:
Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5));
Bag.AddProperty<string>("Name");
Ответ 2
Изменить: поясните, вы говорите атрибуты С# или члены вашего класса?
Единственный способ добавить атрибуты С# - создать совершенно новый класс с дополнительными атрибутами, скомпилировать и загрузить новую сборку в существующий AppDomain.
Ответ 3
Используйте хэш-таблицу для хранения ваших атрибутов.
Если вам нужна дополнительная гибкость во время выполнения, вы можете попробовать Ruby или другой интерпретируемый язык.
Ответ 4
Взгляните на время выполнения динамического языка. Вы также можете рассмотреть динамический язык, например, IronRuby или IronPython.
Какую проблему вы пытаетесь решить?
Ответ 5
Атрибуты являются частью метаданных типа и поэтому они жестко закодированы в скомпилированной сборке (что также позволяет вам использовать только некоторые примитивные типы, а не произвольные данные в атрибутах).
В результате вы не можете добавлять какие-либо атрибуты к типу во время выполнения. Но существуют различные альтернативные методы. Вы можете использовать простые словари или что-то более мощное, например прикрепленные свойства зависимостей.
Ответ 6
Я бы пошел с PostSharp, очень элегантным AOP (или инъекция политики).
PostSharp позволяет вводить пользовательские атрибуты.
В записи блога, на которую ссылается в сообщении, есть код, который вы можете скачать для достижения своей цели.
Ответ 7
Этот пост ответил мне на это: