Почему вы используете "пользовательские атрибуты" в своем коде (.NET)

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

Ответ 2

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

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

Это относительно редкое событие, конечно - но это может произойти.

Ответ 3

Если вы хотите написать свою собственную систему, такую как WCF, Serialization и т.д....

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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