Глава 18.
настраиваемые
атрибуты
В этой главе описывается один из самых новаторских механизмов Microsoft .NET
Framework — механизм
настраиваемых атрибутов
(custom attributes). Именно на-
страиваемые атрибуты позволяют снабжать кодовые конструкции декларативными
аннотациями, наделяя код особыми возможностями. Настраиваемые атрибуты
дают возможность задать информацию, применимую практически к любой записи
таблицы метаданных. Информацию об этих расширяемых метаданных можно запра-
шивать во время выполнения с целью динамического изменения хода выполнения
программы. Настраиваемые атрибуты применяются в различных технологиях .NET
Framework (Windows Forms, WPF, WCF и т. п.), что позволяет разработчикам легко
выражать свои намерения в коде. Таким образом, умение работать с настраиваемыми
атрибутами необходимо всем разработчикам .NET Framework.
сфера применения
настраиваемых атрибутов
Атрибуты
public
,
private
,
static
и им подобные применяются как к типам, так
и к членам типов. Никто не станет спорить с тем, что атрибуты полезны — но
как насчет возможности задания собственных атрибутов? Предположим, нужно
не просто определить тип, но и каким-либо образом указать на возможность его
удаленного использования посредством сериализации. Или, к примеру, назначить
методу атрибут, который означает, что для выполнения метода должны быть полу-
чены некоторые разрешения безопасности.
Разумеется, создавать настраиваемые атрибуты и применять их к типам и мето-
дам очень удобно, однако для этого компилятор должен распознавать эти атрибуты
и заносить соответствующую информацию в метаданные. Фирмы-разработчики
предпочитают не публиковать исходный код своих компиляторов, поэтому спе-
циалисты Microsoft предложили альтернативный способ работы с настраиваемыми
атрибутами, которые представляют собой мощный механизм, полезный как при
разработке, так и при выполнении приложений. Определять и задействовать на-
страиваемые атрибуты может кто угодно, а все CLR-совместимые компиляторы
должны их распознавать и генерировать соответствующие метаданные.
Следует понимать, что настраиваемые атрибуты представляют собой лишь
средство передачи некой дополнительной информации. Компилятор помещает
465
Сфера.применения.настраиваемых.атрибутов
эту информацию в метаданные управляемого модуля. Большая часть атрибутов
для компилятора просто не имеет значения; он обнаруживает их в исходном коде
и создает для них соответствующие метаданные.
Библиотека классов .NET Framework (FCL) включает определения сотен на-
страиваемых атрибутов, которые вы можете использовать в своем коде. Вот не-
сколько примеров:
Атрибут
DllImport
при применении к методу информирует CLR о том, что метод
реализован в неуправляемом коде указанной DLL-библиотеки.
Атрибут
Serializable
при применении к типу информирует механизмы се-
риализации о том, что экземплярные поля доступны для сериализации и десе-
риализации.
Атрибут
AssemblyVersion
при применении к сборке задает версию сборки.
Атрибут
Flags
при применении к перечислимому типу превращает перечисли-
мый тип в набор битовых флагов.
Рассмотрим код с множеством примененных к нему атрибутов. В C# имена на-
страиваемых атрибутов помещаются в квадратные скобки непосредственно перед
именем класса, объекта и т. п. Не пытайтесь понять, что именно делает код; я всего
лишь хочу показать, как выглядят атрибуты:
using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
internal sealed class OSVERSIONINFO {
public OSVERSIONINFO() {
OSVersionInfoSize = (UInt32) Marshal.SizeOf(this);
}
public UInt32 OSVersionInfoSize = 0;
public UInt32 MajorVersion = 0;
public UInt32 MinorVersion = 0;
public UInt32 BuildNumber = 0;
public UInt32 PlatformId = 0;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public String CSDVersion = null;
}
internal sealed class MyClass {
[DllImport("Kernel32", CharSet = CharSet.Auto, SetLastError = true)]
public static extern Boolean GetVersionEx([In, Out] OSVERSIONINFO ver);
}
В данном случае атрибут
StructLayout
применяется к классу
OSVERSIONINFO
,
атрибут
MarshalAs
— к полю
CSDVersion
, атрибут
DllImport
— к методу
GetVersionEx
,
а атрибуты
In
и
Out
— к параметру
ver
метода
GetVersionEx
. В каждом языке опре-
466
Do'stlaringiz bilan baham: |