Для чего нужны атрибуты

Что такое атрибуты данных?

Что такое атрибуты?

HTML-элементы могут иметь атрибуты, которые используются для различных целей: размещения информации, указания типа элемента, его стилей и т.д.

Не рекомендуется создавать собственные атрибуты или применять существующие для несвязанных функций.

Из-за этого снижается валидность кода.

Синтаксис

Пользовательские атрибуты HTML позволяют размещать в них свою собственную информацию. Вот пример:

Атрибуты данных часто называют дата-атрибутами, так как в их названии используется слово data-*.

Можно ли использовать только атрибут data?

Это, скорее всего, не повлияет на работоспособность кода. Но вы не сможете использовать API JavaScript, о котором мы расскажем позже.

Чего нельзя делать с атрибутами данных?

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

Стилизация с помощью атрибутов данных

С помощью CSS можно выбирать HTML-элементы на основе атрибутов и их значений.

При использовании атрибутов data-* вы получаете возможность использовать логику «включено/выключено», а также выбирать элементы на основе значения атрибута.

Специфика выбора атрибутов

Мы часто рассматриваем специфику применения стилей, как значение из четырех частей:

встроенные стили, идентификаторы, классы/атрибуты, теги.

Таким образом, селектор только атрибута выглядит как 0, 0, 1, 0. Приведенный ниже селектор:

… выглядит как 0, 0, 2, 1.
2, потому что имеется один класс (.card) и один атрибут ([data-foo=»bar»]). 1 – потому что есть один тег (div).

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Значения атрибутов без учета регистра

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

Это строчная буква i внутри скобок.

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

CSS позволяет извлечь значение атрибута данных и отобразить его.

Пример использования стиля

Вы можете использовать атрибуты данных, чтобы указать количество столбцов в сетке.

Доступ к атрибутам данных в JavaScript

Можно получить доступ к значению атрибута с помощью универсального метода getAttribute().

Но атрибуты данных также имеют собственный API. Допустим, что у вас есть элемент с несколькими атрибутами данных:

Если есть ссылка на этот элемент, вы можете устанавливать и получать такие атрибуты:

Обратите внимание на использование camelCase в последней строке. API автоматически преобразует атрибуты кебаб-стиля в HTML.

Он также предоставляет доступ к встроенным наборам данных:

JSON внутри атрибутов данных

А почему бы и нет? Это просто строка, и ее можно отформатировать как допустимый формат JSON. Вы можете восстановить эти данные и при необходимости проанализировать их.

Сценарии использования JavaScript

Можно использовать атрибуты данных для помещения в HTML-код информации, которая может понадобиться JavaScript для выполнения определенных задач.

Допустим, что у вас есть кнопка «Мне нравится»:

У этой кнопки есть обработчик клика. Он выполняет Ajax-запрос к серверу, чтобы при клике увеличить количество лайков в базе данных. Он знает, какую запись обновлять, поскольку получает ее из атрибута данных.

Поддержка браузерами

Число указывает на то, что браузер поддерживает функцию, начиная с этой версии.

Десктопные

Мобильные

Пожалуйста, оставьте ваши комментарии по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, подписки, лайки, дизлайки, отклики!

Пожалуйста, оставляйте ваши комментарии по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, подписки, отклики, дизлайки, лайки!

Источник

Атрибут: определение и применение термина

Здравствуйте, уважаемые читатели блога KtoNaNovenkogo.ru. Сегодня продолжим разбирать слова, имеющие свои особенности при применении в разных сферах.

Возьмем для рассмотрения слово «атрибут», узнаем, что это такое и когда его применение является уместным.

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Атрибут – это …

Что вы подумаете, когда услышите, допустим, такую фразу: «Непременные атрибуты празднования Нового года – это наряженная елка, мандарины, фейерверки».

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

Атрибут – это отличительная особенность (комплекс особенностей), характеризующих какой-либо объект, процесс или событие.

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Атрибут в переводе с латинского «attributio» обозначает признак, особенность, знак отличия.

Говоря простыми словами, есть объект и есть то, что в нашем сознании неразделимо связано с этим объектом.

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

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Примеры атрибутов из повседневной жизни:

Далее рассмотрим более сложные примеры применения понятие «атрибут».

Атрибут в информатике

Информатика – это наука о сборе, преобразовании, хранении и передачи данных посредством компьютерных систем и программного обеспечения. Файлы – хранилища блоков информации, которыми оперирует операционная система компьютера.

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

Атрибуты файлов в DOS, OS/2, Windows:

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

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

Характеристики тегов указываются атрибутами тега. Они записываются после указания имени открывающего тега через пробел. Может быть использовано несколько атрибутов, которые записываются через пробел.

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Объектно-ориентированное программирование (ООП) манипулирует программными объектами, т.е. подпрограммами, каждая из которых позволяет пользователю (программисту) создавать новую программу с помощью обращения к конкретным уже созданным программным объектам.

Объекты, связанные общностью каких-либо свойств, объединяются в класс. Чтобы идентифицировать нужный пользователю класс, каждый из них описывается с помощью специальных атрибутов.

Атрибут (поле) класса в ООП – это определенное свойство класса, которое диктует допустимые значения для каждого из объектов (экземпляров) класса. Атрибуты класса могут быть:

Атрибут в философии

Объект, существующий автономно, в философии называется субстанцией. Ее сущность определяется комплексом признаков, которые и определяют ее существование. Эти признаки и есть атрибуты.

Древнегреческий философ Аристотель считал, что не бывает вещи без атрибута, поэтому атрибут – это неотъемлемое свойство всякой субстанции.

Немецкий философ Лейбниц, живший в 17 веке, считал, что субстанция – это неделимое целое вещи и ее свойства (атрибутов).

Пример: Иванов – человек. Иванов – это биологический объект, а человек – это характеристика конкретного объекта Иванова. В свою очередь, можно рассматривать человека как объект, одним из главных атрибутов которого является мышление. Следовательно, атрибутом Иванова является мышление.

Философия наделяет материю следующими атрибутами:

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Это значит, что материя находится в постоянном движении в пространственно-временном континууме.

Краткое резюме

Если обобщить все вышесказанное, то можно дать краткое и емкое определение: атрибут – это характеристика какого-либо объекта или явления.

Применение термина в повседневной жизни оправдано в том случае, если нужно охарактеризовать какой-либо объект, процесс или явление, но не человека. Не говорят: «Атрибутами Петрова является профессионализм и добросовестность», а высказываются, что Петров профессионал в своем деле и добросовестный работник.

Читайте наш блог, это познавательно!

Автор статьи: Елена Копейкина

Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru

Эта статья относится к рубрикам:

Комментарии и отзывы (4)

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

Александр: иконки сайтов называют фавиконами (фавиконками).

Философская концепция кажется слишком плоской. Скорее это сущность определяет атрибуты, а не наоборот. Ведь они могут измениться, а автономный объект останется.

Атрибутом можно назвать только то, что неразрывно связано с объектом, собственно мы и можем идентифицировать объект, исходя из присущих только ему свойств.

Источник

Атрибуты в C#

Достаточно много времени до меня не доходило что же за такая штука эти Атрибуты.

Сел, разобрался, прочитал непонятные определения и предлагаю полученное мной понимание о том что же это такое.

Атрибут — это класс, унаследованный от базового класса Attribute.
Суть атрибута в том, что он используется для генерации описаний. Создав атрибут вы можете наделить его своими свойствами которыми вы желаете наградить класс, поле, свойство или метод, Атрибут не влияет на значение полей и свойств и на выполнение методов класса, если в теле метода не учитывается информация хранящаяся в атрибуте. Но есть очень важный момент — Значение атрибута невозможно изменять в процессе выполнения кода, так как значения их свойств хранятся в виде констант в скомпилированном модуле

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

И некий класс который мы наградим описанным атрибутом и будем использовать его значение для формирования результата функции GetArray:

Как видно из кода, сначала мы получаем описание нашего класса, далее проверяем наличие нашего атрибута и в случае его наличия мы формируем массив с указанным в атрибуте количеством элементов.

А теперь унаследовавшись от этого класса и задав новому классу другое значение атрибута при вызове метода мы получим массив нужной размерности.

Данная статья даёт только общее и скудное описание атрибутов, но используя его, можно понять, что это такое.

Источник

Атрибуты C#: обо всех аспектах

Здравствуй, читатель. В этой статье описаны атрибуты со всех сторон — начиная от спецификации, смысла и определения атрибутов, создания собственных и работе с ними, заканчивая добавлением атрибутов на рантайме и наиболее полезными и интересными существующими атрибутами. Если вам интересна тема атрибутов в C#, то добро пожаловать под кат.

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Содержание

Введение

Как всегда, начнем с определений и спецификаций. Это поможет понять и осознать атрибуты на всех уровнях, что, в свою очередь, очень полезно для того, чтобы находить им правильные применения.

С синтаксической точки зрения (в метаданных) есть следующие атрибуты

Пример

Как видно StructLayoutAttribute имеет специальный синтаксис, так как в IL он представлен как «explicit». ObsoleteAttribute использует общий синтаксис — в IL начинается с «.custom». SecurityPermissionAttribute как атрибут безопасности превратился в «.permissionset assert».

Пользовательские атрибуты добавляют пользовательскую информацию к метаданным. Этот механизм может использоваться для хранения специфичной для приложения информации во время компиляции и для доступа к ней во время выполнения или для чтения и анализа другим инструментом. Хотя любой определенный пользователем тип может быть использован в качестве атрибута, для соответствия CLS необходимо, чтобы атрибуты наследовались от System.Attribute. CLI предопределяет некоторые атрибуты и использует их для управления поведением во время выполнения. Некоторые языки определяют атрибуты для представления возможностей языка, не представленных непосредственно в CTS.

Как уже упоминалось, атрибуты хранятся в метаданных, которые, в свою очередь, формируются на этапе компиляции, т.е. вносятся в PE файл (как правило *.dll). Таким образом, добавить во время выполнения атрибут можно только модифицируя исполняемый файл во время выполнения (но времена самоизменяющихся программ уже давно в прошлом). Отсюда следует, что на этапе выполнения их добавить нельзя, но это не совсем точно. В случае, если мы формируем свою сборку, определяем в ней типы, то мы можем на этапе выполнения создать новый тип и вешать атрибуты на него. Так что формально, мы все же можем добавлять атрибуты на этапе выполнения (пример будет в самом низу).

А теперь немного об ограничениях

Если по каким-то причинам в одной сборке существует 2 атрибута с именами Name и NameAtribute, то становится невозможным поставить первый из них. При использовании [Name] (т.е. без суффикса) компилятор говорит, что видит неопределенность. При использовании [NameAttribute] мы поставим NameAttribute, что логично. Для такой мистической ситуации с недостатком воображения при именовании существует специальный синтаксис. Чтобы поставить первую версию без суффикса можно указать знак собаки (т.е. [Name] — шутка, так не надо) перед именем атрибута [@Name].

Пользовательские атрибуты могут быть добавлены к чему угодно, кроме пользовательских атрибутов. Имеется в виду метаданные, т.е. если мы ставим в C# атрибут над классом атрибута, то в метаданных он будет относиться к классу. А вот добавить атрибут к «public» нельзя. Зато можно к сборкам, модулям, классам, типам значений, перечислениям (enum), конструкторам, методам, свойствам, полям, событиям, интерфейсам, параметрам, делегатам, возвращаемым значениям или обобщенным параметрам. В примере ниже приведены очевидные и не очень примеры того, как можно поставить атрибут на ту или иную конструкцию.

Атрибуты имеют 2 типа параметров — именованные и позиционные. К позиционным относятся параметры конструктора. К именованным — публичные свойства с доступным сеттером. При этом это не просто формальные названия, все параметры можно указывать при объявлении атрибута в скобках после его названия. Именованные не являются обязательными.

Допустимые параметры (обоих видов) для атрибута должны быть одного из перечисленных типов:

Существует два вида пользовательских атрибутов: подлинные пользовательские атрибуты (genuine custom attributes) и псевдо-пользовательские (pseudo-custom).
В коде они выглядят одинаково (указываются над конструкцией языка в квадратных скобках), но обрабатываются по-разному:

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

Атрибуты с поддержкой рантайма

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

В таблице ниже перечислены псевдо-пользовательские атрибуты и специальные пользовательские атрибуты (CLI или компиляторы обрабатывают их специальным образом).

Псевдо-пользовательские атрибуты (их нельзя получить через рефлексию).
CLI Атрибуты:

АтрибутОписание
AssemblyAlgorithmIDAttributeЗаписывает идентификатор используемого алгоритма хеширования. Задает поле Assembly.HashAlgId
AssemblyFlagsAttributeЗаписывает флаги для соответствующей сборки. Задает поле Assembly.Flags
DllImportAttributeПредоставляет информацию о коде, реализованном в неуправляемой библиотеке. Устанавливает Method.Flags.PinvokeImpl бит соответствующего метода; добавляет новую запись в ImplMap (устанавливая значения MappingFlags, MemberForwarded, ImportName и ImportScope)
StructLayoutAttributeПозволяет явно задать способ размещения полей ссылочного или значимого типа. Устанавливает поле TypeDef.Flags.LayoutMask для типа. Также может устанавливать поля TypeDef.Flags.StringFormatMask, ClassLayout.PackingSize и ClassLayout.ClassSize
FieldOffsetAttributeОпределяет смещение в байтах полей в ссылочном или значимом типе. Устанавливает значение FieldLayout.OffSet для соответствующего метода
InAttributeПоказывает, что параметр передается как [in] аргумент. Устанавливает Param.Flags.In бит для соответствующего параметра
OutAttributeПоказывает, что параметр передается как [out] аргумент. Устанавливает Param.Flags.Out бит для соответствующего параметра
MarshalAsAttributeОпределяет способ маршалинга данных между управляемым и неуправляемым кодом. Устанавливает Field.Flags.HasFieldMarshal бит для поля (или Param.Flags.HasFieldMarshal бит для параметра); Добавляет запись в таблицу FieldMarshal (устанавливая значения Parent и NativeType)
MethodImplAttributeОпределяет детали реализации метода. Устанавливает значение Method.ImplFlags для соответствующего метода

CLS Атрибуты — языки должны поддерживать их:

АтрибутОписание
AttributeUsageAttributeИспользуется для указания, как атрибут может быть использован
ObsoleteAttributeПоказывает, что элемент не должен использоваться
CLSCompliantAttributeУказывает, объявлен ли элемент как CLS-совместимый
АтрибутОписание
ThreadStaticAttributeПредоставляет поля типа, относящиеся к потоку
ConditionalAttributeПомечает метод как вызываемый, опираясь на условие компиляции (указанное в /define). Если условие не соблюдено, то метод не вызовется (И не будет скомпилирован в IL). Может быть помечен только void метод. В противном случае возникнет ошибка компиляции
DecimalConstantAttributeСохраняет значение константы типа decimal в метаданных
DefaultMemberAttributeОпределяет член класса, который будет использоваться по умолчанию методом InvokeMember
CompilationRelaxationsAttributeУказывает, являются ли исключения из проверок инструкций строгими или смягченными. На текущий момент можно передать только параметр NoStringInterning, который помечает сборку как не требующую интернирования строковых литералов. Но этот механизм все еще может использоваться
FlagsAttributeАтрибут, указывающий, должен ли enum восприниматься как битовые флаги
IndexerNameAttributeУказывает имя, под которым индексатор будет известен в языках программирования, которые не поддерживают такую ​​возможность напрямую
ParamArrayAttributeПоказывает, что метод принимает переменное число параметров

Полезные атрибуты

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

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

Единственным аргументом конструктора является строка с форматом отображения. То, что будет находиться между фигурными скобками, будет вычислено. Формат как у интерполированной строки, только без доллара. Нельзя использовать указатели в вычисляемом значении. Кстати, если у вас есть переопределенный ToString, то его значение будет показываться как если бы оно было в этом атрибуте. Если есть и ToString и атрибут, то значение берется из атрибута.
Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

DebuggerBrowsableAttribute определяет способ отображения поля или свойства в окне переменных отладчика. Принимает DebuggerBrowsableState, который имеет 3 опции:

DebuggerTypeProxy — если объект просматривается в отладчике сотни раз в день, то можно заморочиться и потратить минуты 3 на создание прокси объекта, который отобразит исходный объект как надо. Обычно прокси объект для отображения — внутренний класс. Собственно, он и будет отображаться вместо целевого объекта.

Для чего нужны атрибуты. Смотреть фото Для чего нужны атрибуты. Смотреть картинку Для чего нужны атрибуты. Картинка про Для чего нужны атрибуты. Фото Для чего нужны атрибуты

Другие полезные атрибуты

ThreadStatic — атрибут позволяющий сделать статическую переменную своей для каждого потока. Для этого надо поставить атрибут над статическим полем. Стоит помнить важный нюанс — инициализация статическим конструктором будет выполнена только один раз, и переменная поменяется в том потоке, который выполнит статический конструктор. В остальных она останется дефолтной. (ЗЫ. Если вам необходимо такое поведение, советую взглянуть в сторону класса ThreadLocal).

InternalsVisibleTo — позволяет указать сборку, которой будут видны элементы, помеченные internal. Может показаться, что если какой-то сборке нужны определенные типы и их члены, можно просто пометить их public и не париться. Но хорошая архитектура подразумевает сокрытие деталей имплементации. Тем не менее они могут понадобиться для каких-нибудь инфраструктурных вещей, например, тестовых проектов. С помощью этого атрибута можно поддерживать и инкапсуляцию, и требуемый процент покрытия тестами.

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

DisablePrivateReflection — делает все приватные члены сборки недосягаемыми для рефлексии. Атрибут ставиться на сборку.

Определение своего атрибута

Не просто так этом раздел стоит последним. Ведь лучший способ понять, в каких случаях будет выгодно использовать атрибут — посмотреть на уже используемые. Сложно сказать формализованное правило, когда следует задуматься о собственном атрибуте. Зачастую их используют как дополнительную информацию о типе/его члене или другой конструкции языка, которая бывает общей у совершенно разных сущностей. Как пример — все атрибуты, используемые для сериализации/ОРМ/форматирования и тд. Из-за обширного применения данных механизмов к совершенно разным типам, зачастую не известным разработчикам соответствующего механизма, использование атрибутов — отличный способ дать пользователю возможность предоставлять декларативную информацию для данного механизма.

Использование своих атрибутов можно разделить на 2 части:

Создание атрибута и его использование

Для создания своего атрибута достаточно наследоваться от System.Attribute. При этом желательно придерживаться упомянутого стиля именования — заканчивать имя класса на Attribute. При этом никакой ошибки не будет, если опустить этот суффикс. Как упоминалось ранее, атрибуты могут иметь 2 типа параметров — позиционные и именованные. Логика их применения такая же, как и со свойствами и параметрами конструктора у класса — значения, необходимые для создания объекта, для которых не существует разумного «дефолта» выносятся в позиционные (т.е. конструктор). То, чему можно поставить какой-то разумный дефолт, который будет зачастую использован, лучше выделить в именованный (т.е. свойство).

Немаловажным в создании атрибута является ограничение мест его применения. Для этого используется AttributeUsageAttribute. Обязательным параметром (позиционным) является AttributeTarget, определяющий место использования атрибута (метод, сборка и тд). Необязательными (именованными) параметрами являются:

Метод (функция) — тоже информация и тоже может описывать конструкцию. И используя полиморфизм в атрибутах можно предоставить весьма мощный и удобный инструмент, где пользователь сможет влиять как на информацию, используемую вашим инструментом, так и на определенные этапы выполнения и обработки. При этом ему не надо будет плодить классы, внедрять зависимости, стоить фабрики и их интерфейсы, которые будут создавать эти классы. Достаточно будет создать единственный класс-наследник, который инкапсулирует в себе детали работы с элементом, к которому он относится. Но, как правило, достаточно обычного «РОСО» атрибута с парой свойств.

Получение и обработка атрибута

Обработка полученных атрибутов зависит от конкретного случая и может быть сделана абсолютно по-разному. Сложно привести полезные для этого функции и приемы.

Получение атрибутов во время выполнения осуществляется с помощью рефлексии. Для получения атрибута с определенного элемента существуют различные способы.

Но все берет начало от интерфейса ICustomAttributeProvider. Его реализуют такие типы как Assembly, MemberInfo, Module, ParameterInfo. В свою очередь наследниками MemberInfo являются Type, EventInfo, FieldInfo, MethodBase, PropertyInfo.

Интерфейс имеет лишь 3 функции, и они не очень удобные. Они работают с массивами (даже если мы знаем, что атрибут может быть лишь один) и не параметризованы типом (используют object). Поэтому напрямую к функциям этого интерфейса придется обращаться редко (не сказал никогда, потому что не хочу быть категоричным). Для удобства использования существует класс CustomAttributeExtensions, в котором собрано множество методов расширения для всевозможных типов, выполняющих несложные операции по приведению типов, выборке единственного значения и так далее, тем самым освобождая разработчика от данной необходимости. Также эти методы доступны как статические в классе Attribute с полезнейшей функцией игнорирования параметра inherit (для нонконформистов).

Основные используемые функции приведены ниже. Первый параметр, указывающий какой тип расширяет метод, я опустил. Также везде, где указан параметр bool inherit существует перегрузка без него (со значением по умолчанию true). Этот параметр указывает, нужно ли учитывать при выполнении метода атрибуты родительского класса или базового метода (если используется на переопределенном методе). В случае, если в атрибуте inherit = flase, то даже установка его в true не поможет учитывать атрибуты базового класса

Название методаОписание
GetCustomAttributes (bool inherit)получает перечисление атрибутов указанного типа. Если атрибут один, вернется перечисление из 1 элемента
GetCustomAttribute (bool inherit)возвращает единственный атрибут указанного типа. Если таких несколько, выбрасывает исключение System.Reflection.AmbiguousMatchException: Multiple custom attributes of the same type found
GetCustomAttributes()возвращает перечисление атрибутов всех типов
GetCustomAttributesData()возвращает перечисление CustomAttributeData, в котором есть свойства позволяющие получить конструктор, параметры (именованные и позиционные), аргументы конструктора
IsDefined(Type attrType, bool inherit)возвращает true, если атрибут объявлен над элементом, false если нет

Для наглядности предлагаю взглянуть на небольшое демо работы всех упомянутых функций.

Ну и для академического интереса привожу пример определения атрибутов во время выполнения. Данный код не претендует на звание самого красивого и поддерживаемого.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *