Пользовательские атрибуты

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

При создании атрибута необходимо ответить на два главных вопроса: во-первых, для каких элементов программы может устанавливаться ваш атрибут, и, во-вторых, какая информация будет в нем храниться?

Использование атрибута

Включение атрибута AttributeUsage в класс атрибута управляет возможностями использования последнего. Допустимые значения атрибута AttributeUsage определяются в перечислении AttributeTargets.

Значение

Описание

Assembly

Сборка, в которую входит программа

Module

Текущий файл программы

Class

Класс

Struct

Структура

Enum

Перечисление

Constructor

Конструктор

Method

Метод (функция класса)

Property

Свойство

Field

Поле (переменная класса)

Event

Событие

Interface

Интерфейс

Parameter

Параметр функции класса

ReturnValue

Возвращаемое значение функции класса

Delegate

Делегат

All

Любое место

ClassMembers

Класс, структура, перечисление, конструктор, метод, свойство, поле, событие, делегат, интерфейс

При использовании атрибута AttributeUsage можно указать один идентификатор или несколько, объединенных в операции OR.

Атрибут AttributeUsage также определяет кратность использования атрибута (однократно или многократно). Задача решается при помощи именованного параметра AllowMultiple. Это выглядит примерно так:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Event,

AllowMultiple = true)]

Параметры атрибутов

Данные, хранящиеся в атрибуте, делятся на две группы: обязательные и необязательные.

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

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

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

Типы параметров атрибутов

В формате сохранения атрибутов поддерживается лишь некоторое подмножество типов .NET Runtime. Следовательно, параметры атрибутов могут относиться лишь к определенному набору типов. Допускаются следующие типы:

l bool, byte, char, double, float, int, long, short, string;

l object;

l System.Type;

l открытое перечисление (не вложенное в другой тип с уровнем доступа, отличным от public);

l одномерный массив любого из перечисленных типов.

Предлагаю ознакомиться с аналогичными статьями: