В предыдущем примере для вывода описания транспортного средства типа Winnebago применялось ранее связывание. Это было возможно благодаря тому, что тип класса VehicleDescriptionAttribute
AttributedCarLibrary как открытый член. Для рефлексии атрибутов также допускается использовать динамическую загрузку и позднее связывание.Добавьте к решению новый проект консольного приложения по имени VehicleDescriptionAttributeReaderLateBinding
AttributedCarLibrary.dll в каталог проекта (или в \bin\Debug\net5.0, если вы работаете в Visual Studio). Модифицируйте файл Program.cs, как показано ниже:using System;
using System.Reflection;
Console.WriteLine("***** Value of VehicleDescriptionAttribute *****\n");
ReflectAttributesUsingLateBinding();
Console.ReadLine();
static void ReflectAttributesUsingLateBinding()
{
try
{
// Загрузить локальную копию сборки AttributedCarLibrary.
Assembly asm = Assembly.LoadFrom("AttributedCarLibrary");
// Получить информацию о типе VehicleDescriptionAttribute.
Type vehicleDesc =
asm.GetType("AttributedCarLibrary.VehicleDescriptionAttribute");
// Получить информацию о типе свойства Description.
PropertyInfo propDesc = vehicleDesc.GetProperty("Description");
// Получить все типы в сборке.
Type[] types = asm.GetTypes();
// Пройти по всем типам и получить любые атрибуты VehicleDescriptionAttribute.
foreach (Type t in types)
{
object[] objs = t.GetCustomAttributes(vehicleDesc, false);
// Пройти по каждому VehicleDescriptionAttribute и вывести
// описание, используя позднее связывание.
foreach (object o in objs)
{
Console.WriteLine("-> {0}: {1}\n", t.Name,
propDesc.GetValue(o, null));
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Если вы прорабатывали примеры, рассмотренные ранее в главе, тогда приведенный код должен быть более или менее понятен. Единственный интересный момент здесь связан с применением метода PropertyInfo.GetValue()
***** Value of VehicleDescriptionAttribute *****
-> Motorcycle: My rocking Harley
-> HorseAndBuggy: The old gray mare, she ain't what she used to be...
-> Winnebago: A very long, slow, but feature-rich auto
Практическое использование рефлексии позднего связывания и специальных атрибутов
Хотя вы видели многочисленные примеры применения этих приемов, вас по-прежнему может интересовать, когда использовать рефлексию, динамическое связывание и специальные атрибуты в своих программах. Действительно, данные темы могут показаться в большей степени относящимися к академической стороне программирования (что в зависимости от вашей точки зрения может быть как отрицательным, так и положительным аспектом). Для содействия в отображении указанных тем на реальные ситуации необходим более серьезный пример. Предположим, что вы работаете в составе команды программистов, которая занимается построением приложения, соблюдая требование о том, что продукт должен быть расширяемым за счет использования добавочных сторонних инструментов.