Атрибуты в среде.NET и языке C#.
Атрибуты в.NET тесно связаны с понятием рефлексии.
Рефлексия — встроенный в среду.NET механизм, позволяющий во время выполнения получать информацию о наличествующих в сборках метаданных.
Метаданные
Помимо исполняемого кода, в сборке.NET содержатся исчерпывающие и точные метаданные, которые описывают каждый определенный в двоичном файле тип (например, класс, структуру или перечисление), а также всех его членов (например, свойства, методы или события). За генерацию метаданных по типам отвечает компилятор. Из-за того, что метаданные.NET являются настолько детальными, сборки представляют собой полностью самоописываемые (self-describing) сущности.
Для описания типов используется класс System.Type. Способы получения описания типа:
· метод System.Object.GetType(). Требует наличия созданного экземпляра типа:
Point p = new Point();
Type t = p.GetType();
· операция typeof(). Не требует наличия созданного экземпляра, однако тип должен быть известен при компиляции:
Type t = typeof(Point);
· статический метод System.Type.GetType(). Наиболее гибкий. Знать сам тип, из которого извлекаются метаданные, на этапе компиляции не требуется, необходимо указать имя:
|
|
Type t = System.Type.GetType(“GeomLib.Ellipse”)
Имея описатель типа, можно получить доступ к его характеристикам, методам, свойствам при помощи свойств/методов класса System.Type, например: IsAbstract, IsArray, IsClass, IsEnum, GetConstructors(), GetEvents(), GetFields(), Getlnterfaces(), GetMembers(), GetMethods() и др.
Понятие атрибутов
Помимо стандартных метаданных, которые помещаются в любую сборку, программисты в.NET могут включать в состав сборки дополнительные метаданные с использованием атрибутов. В сущности, атрибуты представляют собой не более чем просто аннотации, которые могут добавляться в код и применяться к какому-то конкретному типу (классу, интерфейсу, структуре и т.д.), члену (свойству, методу и т.д.), сборке или модулю.
Предопределенные и собственные атрибуты
В.NET доступно множество предопределенных атрибутов, которые полезно применять в своих приложениях. Обработка этих атрибутов уже реализована.
Примеры предопределенных атрибутов:
[Obsolete] | Указывает, что данный тип/член является устаревшим. При использовании элемента с этим атрибутом, будет выведено предупреждение компилятора |
[Dlllmport] | Позволяет обращаться к не-managed библиотекам, в том числе к функциям WinAPI, расположенным в системных DLL. |
[Serializable] | Позволяет указать, что класс или структура является "сериализируемой", т.е. способна сохранять свое текущее состояние в потоке |
[NonSerialized] | Позволяет указать, что данное поле в классе или структуре не должно сохраняться в процессе сериализации |
[WebMethod] | Позволяет указать, что метод может вызываться посредством HTTP-запросов, и CLR-среда должна преобразовывать его возвращаемое значение в формат XML |
Также можно создавать собственные атрибуты и тем самым дополнительно уточнять поведение своих типов. Атрибуты представляют собой типы классов, унаследованных от абстрактного базового класса System.Attribute. Для создания собственного атрибута, нужно реализовать новый тип, наследующий от System.Attribute.
|
|