Язык программирования C#9 и платформа .NET5
Финальная задача связана с отображением метаданных, предоставляемых атрибутом
. Создайте метод[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Позднее связывание представляет собой процесс создания экземпляра типа и обращения к его членам без предварительного знания имен членов типа. Позднее связывание часто является прямым результатом динамической загрузки, которая позволяет программным образом загружать сборку .NET Core в память. На примере построения расширяемого приложения было продемонстрировано, что это мощный прием, используемый разработчиками инструментов, а также их потребителями.
Кроме того, в главе была исследована роль программирования на основе атрибутов. Снабжение типов атрибутами приводит к дополнению метаданных лежащей в основе сборки.
Глава 18
Динамические типы и среда DLR
В версии .NET 4.0 язык C# получил новое ключевое слово
, которое позволяет внедрять в строго типизированный мир безопасности к типам, точек с запятой и фигурных скобок поведение, характерное для сценариев. Используя такую слабую типизацию, можно значительно упростить решение ряда сложных задач написания кода и получить возможность взаимодействия с несколькими динамическими языками (вроде IronRuby и IronPython), которые поддерживают .NET Core.dynamicВ настоящей главе вы узнаете о ключевом слове dynamic и о том, как слабо типизированные вызовы отображаются на корректные объекты в памяти с применением исполняющей среды динамического языка (Dynamic Language Runtime — DLR). После освоения служб, предлагаемых средой DLR, вы увидите примеры использования динамических типов для облегчения вызова методов с поздним связыванием (через службы рефлексии) и простого взаимодействия с унаследованными библиотеками СОМ.
На заметку! Не путайте ключевое слово
языка C# с концепцией динамической сборки (объясняемой в главе 19). Хотя ключевое словоdynamicможет применяться при построении динамической сборки, все же это две совершенно независимые концепции.dynamicРоль ключевого слова dynamic языка C#
В главе 3 вы ознакомились с ключевым словом
, которое позволяет объявлять локальные переменные таким способом, что их действительные типы данных определяются на основе начального присваивания во время компиляции (вспомните, что результат называется неявной типизацией). После того как начальное присваивание выполнено, вы имеете строго типизированную переменную, и любая попытка присвоить ей несовместимое значение приведет к ошибке на этапе компиляции.varЧтобы приступить к исследованию ключевого слова
языка С#, создайте новый проект консольного приложения по имениdynamic. Добавьте в классDynamicKeywordследующий метод и удостоверьтесь, что финальный оператор кода на самом деле генерирует ошибку на этапе компиляции, если убрать символы комментария:Programstatic void ImplicitlyTypedVariable(){// Переменная а имеет тип List<int>.var a = new List<int> {90};// Этот оператор приведет к ошибке на этапе компиляции!// a = "Hello";