Вход/Регистрация
ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание
вернуться

Троелсен Эндрю

Шрифт:

 static void Main(string [] args) {

// Получение Type для представления Winnebago.

Type t = typeof(Winnebago);

// Получение атрибутов Winnebago.

object[] customAtts = t.GetCustomAttributes(false);

// Печать описания.

Console.WriteLine("*** Значение VehicleDescriptionAttribute ***\n");

foreach(VehicleDescriptionAtttibute v in customAtts) Console.WriteLine("-› {0}\n", v.Description);

Console.ReadLine;

 }

}

Как следует из самого названия, метод Type.GetCustomAttributes возвращает массив объектов, представляющих все атрибуты, примененные тому к члену, который представлен с помощью Туре (логический параметр этого метода указывает, следует ли расширить поиск на всю цепочку наследования). После получения списка атрибутов выполняется цикл по всем классам VehicleDescriptionAttribute с выводом на печать значения, полученного свойством Description.

Исходный код. Проект VehicleDescriptionAttributeReader размещен в подкаталоге, соответствующем главе 12.

Отображение атрибутов при динамическом связывании

В предыдущем примере использовалось статическое связывание и печатались данные описания для типа Winnebago. Это было возможно благодаря тому, что тип класса VehicleDescriptionAttribute был определен, как открытый член компоновочного блока AttributedCarLibrary. Но для отображения атрибутов можно также использовать динамическую загрузку и динамическое связывание.

Создайте новый консольный проект (VehicleDescriptionAttributeReaderLateBinding) и скопируйте AttributedCarLibrary.dll в каталог \Bin\Debug этого проекта. Затем обновите метод Main так, как предлагается ниже.

using System.Reflection;

 namespace VehicleDescriptionAttributeReaderLateBinding {

class Program {

static void Main(string[] args) {

Console.WriteLine("*** Описания транспортных средств ***\n");

// Загрузка локальной копии 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}\n", t.Name, propDesc.GetValue(o, null));

}

}

Console.ReadLine;

}

}

}

Если вы внимательно анализировали все примеры этой главы, то листинг этого метода Main должен быть для вас (более или менее) понятным. Единственным заслуживающим внимания моментом здесь является использование метода PropertyInfo.GetValue для доступа к свойству. На рис. 12.10 показан соответствующий вывод.

Рис. 12.10. Отображение атрибутов при динамическом связывании

Исходный код. Проект VehiсleDescriptionAttributeReaderLateBinding размещен в подкаталоге, соответствующем главе 12.

Перспективы отображения, статического и динамического связывания и пользовательских атрибутов

Даже после множества примеров применения соответствующих подходов вам может быть не ясно, когда же следует использовать отображение, динамическую загрузку, динамическое связывание и пользовательские атрибуты в программах. Строго говоря, эти вопросы (которые увлекательны сами по себе) можно отнести, скорее, к теоретической стороне программирования (что можно считать как достоинством, так и недостатком, в зависимости от точки зрения). Чтобы спроецировать эти вопросы на реальность, нам нужен реальный пример. Представьте себе на минуту, что вы работаете в команде программистов, созданной для разработки приложения, удовлетворяющего следующему требованию:

  • Читать дальше
  • 1
  • ...
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: