Отображение атрибутов при динамическом связывании
Отображение атрибутов при динамическом связывании
В предыдущем примере использовалось статическое связывание и печатались данные описания для типа Winnebago. Это было возможно благодаря тому, что тип класса VehicleDescriptionAttribute был определен, как открытый член компоновочного блока AttributedCarLibrary. Но для отображения атрибутов можно также использовать динамическую загрузку и динамическое связывание.
Создайте новый консольный проект (VehicleDescriptionAttributeReaderLateBinding) и скопируйте AttributedCarLibrary.dll в каталог BinDebug этого проекта. Затем обновите метод Main() так, как предлагается ниже.
using System.Reflection;
namespace VehicleDescriptionAttributeReaderLateBinding {
class Program {
static void Main(string[] args) {
Console.WriteLine("*** Описания транспортных средств *** ");
// Загрузка локальной копии AttributedCarLibrагу.
Assembly asm = Assembly.Load(AttributedCarLibrary");
// Получение информации типа для VehicleDescriptionAttribute.
Type vehicleDesc = asm.GetType("AttributedCarLibrary.VehicleDescriptionAttribute");
// Получение информации типа для свойства Description.
PropertyInfо propDesc = vehicleDesc.GetProperty("Description");
// Получение всех типов данного компоновочного блока.
Туре[] types = asm.GetTypes();
// Получение VehicleDescriptionAttribute для каждого типа.
foreach (Type t in types) {
object[] objs = t.GetCustomAttributes(vehicleDesc, false);
// Итерации по VehicleDescriptionAttribute и печать
// описаний с динамическим связыванием.
foreach(object о in objs) {
Console.WriteLine("-› {0}: {1} ", t.Name, propDesc.GetValue(o, null));
}
}
Console.ReadLine();
}
}
}
Если вы внимательно анализировали все примеры этой главы, то листинг этого метода Main() должен быть для вас (более или менее) понятным. Единственным заслуживающим внимания моментом здесь является использование метода PropertyInfo.GetValue() для доступа к свойству. На рис. 12.10 показан соответствующий вывод.
Рис. 12.10. Отображение атрибутов при динамическом связывании
Исходный код. Проект VehiсleDescriptionAttributeReaderLateBinding размещен в подкаталоге, соответствующем главе 12.