Шрифт:
Чтобы атрибут [VehicleDescription] мог применяться к классу или структуре только один раз (и соответствующее значение не наследовалось производными типами), можно изменить определение VehicleDescriptionAttribute так.
Теперь если разработчик попытается применить атрибут [VehicleDescription] к чему-либо, кроме класса или структуры, будет сгенерировано сообщение об ошибке компиляции.
Совет. Вашей привычкой должно стать явное указание флагов применения для любого создаваемого вами пользовательского атрибута, поскольку не все языки программирования .NET приветствуют использование атрибутов, не имеющих квалификационных указаний!
Атрибуты уровня компоновочного блока (и уровня модуля)
Можно также задать применение атрибутов ко всем типам в рамках данного модуля или всех модулей в рамках данного компоновочного блока, если, соответственно, использовать признаки [module:] или [assembly:]. Предположим, что нам нужно гарантировать, чтобы каждый открытый тип, определенный в нашем компоновочном блоке, был CLS-допустимым. Для этого в любой из файлов исходного кода C# нужно добавить следующую строку (заметьте, что атрибуты уровня компоновочного блока должны быть указаны за пределами контекста определения пространства имен).
Если теперь добавить фрагмент программного кода, который выходит за пределы спецификации CLS (например, элемент данных без знака)
то будет сгенерирована ошибка компиляции.
Файл AssemblyInfo.cs в Visual Studio 2005
По умолчанию Visual Studio 2005 генерирует файл с именем AssemblyInfo.cs (рис. 12.9).
Рис. 12.9. Файл AssemblyInfo.cs
Этот файл является удобным местом для хранения атрибутов, которые должны применяться на уровне компоновочного блока. В табл. 12.4 приводится список некоторых атрибутов уровня компоновочного блока, о которых вам следует знать.
Исходный код. Проект AttributedCarLibrary размещен в подкаталоге, соответствующем главе 12.
Таблица 12.4. Некоторые атрибуты уровня компоновочного блока
Атрибут | Описание |
---|---|
AssemblyCompanyAttribute | Содержит общую информацию о компании |
AssemblyCopyrightAttribute | Содержит информацию об авторских правах на продукт или компоновочный блок |
AssemblyCultureAttribute | Дает информацию о параметрах локализации или языках, поддерживаемых компоновочным блоком |
AssemblyDescriptionAttribute | Содержит описание продукта или модулей, из которых состоит компоновочный блок |
AssemblyKeyFileAttribute | Указывает имя файла, содержащего пару ключей, используемых для создания подписи компоновочного блока |
AssemblyOperatingSystemAttribute | Обеспечивает информацию о том, на поддержку какой операционной системы рассчитан компоновочный блок |
AssemblyProcessorAttribute | Обеспечивает информацию о том, на поддержку какого процессора рассчитан компоновочный блок |
AssemblyProductAttribute | Обеспечивает информацию о продукте |
AssemblyTrademarkAttribute | Обеcпечивает информацию о торговой марке |
AssemblyVersionAttribute | Указывает информацию версии компоновочного блока, в формате‹главный.дополнительный.компоновка:вариант› |
Отображение атрибутов при статическом связывании
Как уже упоминалось в этой главе, атрибуты будут бесполезны до тех пор, пока некоторый фрагмент программного обеспечения не выполнит их отображение. После выявления атрибута соответствующий фрагмент программного обеспечения может выбрать подходящее действие. Как и само приложение, этот "фрагмент программного обеспечения" может для выявления пользовательского атрибута использовать статическое или динамическое связывание. Для статического связывания требуется, чтобы приложение-клиент к моменту компиляции уже имели определение соответствующего атрибута (в нашем случае это атрибут VehicleDescriptionAttribute). Компоновочный блок AttributedCarLibrary определяет пользовательский атрибут, как открытый класс, поэтому статическое связывание в данном случае будет наилучшим выбором.
Для иллюстрации процесса отображения пользовательских атрибутов создайте новое консольное приложение C# с именем VehicleDescriptionAttributeReader. Затем установите в нем ссылку на компоновочный блок AttributedCarLibrary. Наконец, поместите в исходный файл *.cs следующий программный код.