Почему вы используете «пользовательские атрибуты» в вашем коде (.NET) - PullRequest
14 голосов
/ 24 октября 2011

Может ли кто-нибудь объяснить преимущества (или причины) использования пользовательских атрибутов в вашем коде. Конечно, я использую (и понимаю цель) определенные атрибуты в определенных сценариях (WCF, сериализация и т. Д.), Но я не могу представить какие-либо алгоритмы, в которых мне нужно было бы создавать и использовать свой собственный атрибутов . Может ли кто-нибудь представить пример из реальной жизни, когда использование пользовательских атрибутов приносит что-то в проект.

Ответы [ 8 ]

9 голосов
/ 24 октября 2011

По той же причине, что и WCF и т. Д., Но что-то специфичное для вашего проекта - вы хотите добавить некоторые метаданные к некоторым членам (типам, полям, методам и т. Д.), Чтобы указать что-то об задействованном механизме, а это не то, чтопокрывается существующими атрибутами.

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

Конечно, это относительно редкое событие, но оно может случиться.

3 голосов
/ 24 октября 2011

Если вы хотите написать свою собственную систему, такую ​​как WCF, Сериализация и т. Д ...

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

2 голосов
/ 24 октября 2011

Я использовал аннотации в пользовательской системе AOP (Aspect-Oriented Programming), которую я разработал некоторое время назад. Атрибуты также очень полезны для управления ортогональными задачами, такими как генерация кода.

2 голосов
/ 24 октября 2011

Я регулярно использую пользовательские атрибуты .Net для поддержки инструментов в моей инфраструктуре.Один пример был с очень ранних дней .Net (точнее, C # 1.0).Я работал над исследовательским проектом, у которого был собственный родной C ++ и совершенно новый C #, написанный тобой по-настоящему.

Передняя и задняя часть разделяли очень похожую объектную модель, которая развивалась очень быстро.Не желая передавать код как модели внешнего интерфейса C ++, так и механизму сериализации C ++ и механизму сериализации C #, я выбрал вместо этого атрибуцию типов C # с помощью пользовательских атрибутов.Они сказали мне части модели, которые были разделены между передней и задней частью.

Как только эти атрибуты были созданы, я написал быстрый и грязный инструмент, который

  • Разобрал атрибуты для построения базовой общей модели
  • Сгенерировал код сериализации C #
  • Сгенерировал код C ++
  • Сгенерировал код сериализации C ++

Это значительно упростило поддержание моей модели в актуальном состоянии между двумя моими проектами.Просто измените код C #, скомпилируйте и перезапустите мой инструмент.

1 голос
/ 24 октября 2011

Они действительно полезны в построении картографических объектов / инструментов ORM. Если вы когда-нибудь решите развернуть свою собственную картографическую систему, они почти «необходимы» для получения всех необходимых функций. Он используется больше для того, чтобы сделать методы / классы более общими и использовать отражение, чтобы определить, как обрабатывать объекты / выбирать объекты /etc...

1 голос
/ 24 октября 2011

Пользовательская проверка - это очень хороший пример использования, который можно увидеть по следующим ссылкам:

http://odetocode.com/blogs/scott/archive/2011/02/21/custom-data-annotation-validator-part-i-server-code.aspx

Как создать собственные средства проверки аннотаций данных

1 голос
/ 24 октября 2011

Их можно использовать для маркировки тестов, как, например, в MBUnit.Они также могут быть полезны для кода, который проверяет и загружает классы (например, систему плагинов) для предоставления метаинформации.

0 голосов
/ 24 октября 2011

Чтобы дать вам конкретный случай, когда я их использовал.Мне когда-то приходилось взаимодействовать со скребком для мэйнфреймов.Я создал пользовательский атрибут для аннотирования полей, которые я хотел отправить из моих классов на мэйнфрейм, имен, выходящих за рамки соглашений, специальных правил для форматирования и коллекций.Затем у меня был класс, который мог отражать экземпляры и понимать, какое подмножество полей было необходимо для надлежащего взаимодействия со скребком экрана мэйнфрейма.

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