C #: Как добавить атрибуты к объекту во время выполнения? - PullRequest
11 голосов
/ 19 февраля 2009

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

Ответы [ 7 ]

11 голосов
/ 19 февраля 2009

Что нужно видеть атрибуты? Если это такие вещи, как привязка данных и т. Д., 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 голосов
/ 19 февраля 2009

Редактировать: уточните, пожалуйста, вы говорите о атрибутах c # или участниках вашего класса?

Единственный способ добавить атрибуты c # - создать совершенно новый класс с дополнительными атрибутами, скомпилировать и загрузить новую сборку в существующий домен приложения.

1 голос
/ 19 февраля 2009

Взгляните на динамическую языковую среду выполнения. Вы также можете рассмотреть динамический язык, такой как IronRuby или IronPython.

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

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

1 голос
/ 19 февраля 2009

Используйте хеш-таблицу для хранения ваших атрибутов.

Если вы хотите большей гибкости во время выполнения, вы можете попробовать Ruby или другой интерпретируемый язык.

0 голосов
/ 22 ноября 2010
0 голосов
/ 19 февраля 2009

Я бы пошел с PostSharp , очень элегантным AOP-фреймворком (или Внедрение политики ).

PostSharp позволяет вводить пользовательские атрибуты .
Запись в блоге, на которую ссылаются в посте, содержит код, который можно загрузить для достижения своей цели.

0 голосов
/ 19 февраля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...