Шрифт:
Интервал:
Закладка:
Финальная задача связана с отображением метаданных, предоставляемых атрибутом [CompanyInfo]. Создайте метод DisplayCompanyData(), который принимает параметр System.Туре:
static void DisplayCompanyData(Type t)
{
// Получить данные [CompanyInfo].
var compInfo = t
.GetCustomAttributes(false)
.Where(ci => (ci is CompanyInfoAttribute));
// Отобразить данные.
foreach (CompanyInfoAttribute c in compInfo)
{
Console.WriteLine($"More info about {c.CompanyName}
can be found at {c.CompanyUrl}");
}
}
Наконец, модифицируйте операторы верхнего уровня следующим образом:
Console.WriteLine("***** Welcome to MyTypeViewer *****");
string typeName = "";
do
{
Console.WriteLine("nEnter a snapin to load");
// Введите оснастку для загрузки
Console.Write("or enter Q to quit: ");
// или Q для завершения
// Получить имя типа.
typeName = Console.ReadLine();
// Желает ли пользователь завершить работу?
if (typeName.Equals("Q", StringComparison.OrdinalIgnoreCase))
{
break;
}
// Попытаться отобразить тип.
try
{
LoadExternalModule(typeName);
}
catch (Exception ex)
{
// Найти оснастку не удалось.
Console.WriteLine("Sorry, can't find snapin");
}
}
while (true);
На этом создание примера расширяемого приложения завершено. Вы смогли увидеть, что представленные в главе приемы могут оказаться весьма полезными, и их применение не ограничивается только разработчиками инструментов.
Резюме
Рефлексия является интересным аспектом надежной объектно - ориентированной среды. В мире .NET Core службы рефлексии вращаются вокруг класса System.Туре и пространства имен System.Reflection. Вы видели, что рефлексия — это процесс помещения типа под "увеличительное стекло" во время выполнения с целью выяснения его характеристик и возможностей.
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})Позднее связывание представляет собой процесс создания экземпляра типа и обращения к его членам без предварительного знания имен членов типа. Позднее связывание часто является прямым результатом динамической загрузки, которая позволяет программным образом загружать сборку .NET Core в память. На примере построения расширяемого приложения было продемонстрировано, что это мощный прием, используемый разработчиками инструментов, а также их потребителями.
Кроме того, в главе была исследована роль программирования на основе атрибутов. Снабжение типов атрибутами приводит к дополнению метаданных лежащей в основе сборки.
Глава 18
Динамические типы и среда DLR
В версии .NET 4.0 язык C# получил новое ключевое слово dynamic, которое позволяет внедрять в строго типизированный мир безопасности к типам, точек с запятой и фигурных скобок поведение, характерное для сценариев. Используя такую слабую типизацию, можно значительно упростить решение ряда сложных задач написания кода и получить возможность взаимодействия с несколькими динамическими языками (вроде IronRuby и IronPython), которые поддерживают .NET Core.
В настоящей главе вы узнаете о ключевом слове dynamic и о том, как слабо типизированные вызовы отображаются на корректные объекты в памяти с применением исполняющей среды динамического языка (Dynamic Language Runtime — DLR). После освоения служб, предлагаемых средой DLR, вы увидите примеры использования динамических типов для облегчения вызова методов с поздним связыванием (через службы рефлексии) и простого взаимодействия с унаследованными библиотеками СОМ.
На заметку! Не путайте ключевое слово dynamic языка C# с концепцией динамической сборки (объясняемой в главе 19). Хотя ключевое слово dynamic может применяться при построении динамической сборки, все же это две совершенно независимые концепции.
Роль ключевого слова dynamic языка C#
В главе 3 вы ознакомились с ключевым словом var, которое позволяет объявлять локальные переменные таким способом, что их действительные типы данных определяются на основе начального присваивания во время компиляции (вспомните, что результат называется неявной типизацией). После того как начальное присваивание выполнено, вы имеете строго типизированную переменную, и любая попытка присвоить ей несовместимое значение приведет к ошибке на этапе компиляции.
Чтобы приступить к исследованию ключевого слова dynamic языка С#, создайте новый проект консольного приложения по имени DynamicKeyword. Добавьте в класс Program следующий метод и удостоверьтесь, что финальный оператор кода на самом деле генерирует ошибку на этапе компиляции, если убрать символы комментария:
static void ImplicitlyTypedVariable()
{
// Переменная а имеет тип List<int>.
var a = new List<int> {90};
// Этот оператор приведет к ошибке на этапе компиляции!
// a = "Hello";
- Понимание SQL - Мартин Грубер - Базы данных