Отображение атрибутов при статическом связывании
Отображение атрибутов при статическом связывании
Как уже упоминалось в этой главе, атрибуты будут бесполезны до тех пор, пока некоторый фрагмент программного обеспечения не выполнит их отображение. После выявления атрибута соответствующий фрагмент программного обеспечения может выбрать подходящее действие. Как и само приложение, этот "фрагмент программного обеспечения" может для выявления пользовательского атрибута использовать статическое или динамическое связывание. Для статического связывания требуется, чтобы приложение-клиент к моменту компиляции уже имели определение соответствующего атрибута (в нашем случае это атрибут VehicleDescriptionAttribute). Компоновочный блок AttributedCarLibrary определяет пользовательский атрибут, как открытый класс, поэтому статическое связывание в данном случае будет наилучшим выбором.
Для иллюстрации процесса отображения пользовательских атрибутов создайте новое консольное приложение C# с именем VehicleDescriptionAttributeReader. Затем установите в нем ссылку на компоновочный блок AttributedCarLibrary. Наконец, поместите в исходный файл *.cs следующий программный код.
// Отображение пользовательских атрибутов при статическом связывании.
using System;
using AttributedCarLibrary;
public class Program {
static void Main(string [] args) {
// Получение Type для представления Winnebago.
Type t = typeof(Winnebago);
// Получение атрибутов Winnebago.
object[] customAtts = t.GetCustomAttributes(false);
// Печать описания.
Console.WriteLine("*** Значение VehicleDescriptionAttribute *** ");
foreach(VehicleDescriptionAtttibute v in customAtts) Console.WriteLine("-› {0} ", v.Description);
Console.ReadLine();
}
}
Как следует из самого названия, метод Type.GetCustomAttributes() возвращает массив объектов, представляющих все атрибуты, примененные тому к члену, который представлен с помощью Туре (логический параметр этого метода указывает, следует ли расширить поиск на всю цепочку наследования). После получения списка атрибутов выполняется цикл по всем классам VehicleDescriptionAttribute с выводом на печать значения, полученного свойством Description.
Исходный код. Проект VehicleDescriptionAttributeReader размещен в подкаталоге, соответствующем главе 12.