С#: Как добавить атрибуты к объекту во время выполнения?

Как класс сущности, я хочу добавить атрибуты во время выполнения, как мне это сделать?

Ответ 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.

Какую проблему вы пытаетесь решить?

http://en.wikipedia.org/wiki/Dynamic_Language_Runtime

Ответ 5

Атрибуты являются частью метаданных типа и поэтому они жестко закодированы в скомпилированной сборке (что также позволяет вам использовать только некоторые примитивные типы, а не произвольные данные в атрибутах).

В результате вы не можете добавлять какие-либо атрибуты к типу во время выполнения. Но существуют различные альтернативные методы. Вы можете использовать простые словари или что-то более мощное, например прикрепленные свойства зависимостей.