Язык программирования C#9 и платформа .NET5
Часть 326 из 642 Информация о книге
Создайте новый проект консольного приложения по имени
и с помощью ключевого словаLateBindingAppимпортируйте в него пространства именusingиSystem.IO. Модифицируйте файлSystem.Reflection, как показано ниже:Program.csusing System;using System.IO;using System.Reflection;// Это приложение будет загружать внешнюю сборку и// создавать объект, используя позднее связывание.Console.WriteLine("***** Fun with Late Binding *****");<b>// Попробовать загрузить локальную копию CarLibrary.</b>Assembly a = null;try{a = Assembly.LoadFrom("CarLibrary");}catch(FileNotFoundException ex){Console.WriteLine(ex.Message);return;}if(a != null){CreateUsingLateBinding(a);}Console.ReadLine();static void CreateUsingLateBinding(Assembly asm){try{<b> // Получить метаданные для типа MiniVan.</b>Type miniVan = asm.GetType("CarLibrary.MiniVan");<b> // Создать экземпляр MiniVan на лету.</b>object obj = Activator.CreateInstance(miniVan);Console.WriteLine("Created a {0} using late binding!", obj);}catch(Exception ex){Console.WriteLine(ex.Message);}}Перед запуском нового приложения понадобится вручную скопировать файл
в каталог с файлом проекта (или в подкаталогCarLibrary.dll, если вы работаете в Visual Studio) данного приложения.bin\Debug\net5.0На заметку! Не добавляйте ссылку на
в этом примере! Вся суть позднего связывания заключается в попытке создания объекта, который не известен на этапе компиляции.CarLibrary.dllОбратите внимание, что метод
возвращает экземплярActivator.Createlnstance(), а не строго типизированный объектSystem.Object. Следовательно, если применить к переменнойMiniVanоперацию точки, то члены классаobjне будут видны. На первый взгляд может показаться, что проблему удастся решить с помощью явного приведения:MiniVan// Привести к типу MiniVan, чтобы получить доступ к его членам?// Нет! Компилятор сообщит об ошибке!object obj = (MiniVan)Activator.CreateInstance(minivan);Однако из-за того, что в приложение не была добавлена ссылка на сборку
, использовать ключевое словоCarLibrary.dllдля импортирования пространства именusingнельзя, а значит невозможно и указывать типCarLibraryв операции приведения! Не забывайте, что смысл позднего связывания — создание экземпляров типов, о которых на этапе компиляции ничего не известно. Учитывая сказанное, возникает вопрос: как вызывать методы объектаMiniVan, сохраненного в ссылке наMiniVan? Ответ: конечно же, с помощью рефлексии.System.ObjectВызов методов без параметров
Предположим, что требуется вызвать метод
объектаTurboBoost(). Вспомните, что упомянутый метод переводит двигатель в нерабочее состояние и затем отображает окно с соответствующим сообщением. Первый шаг заключается в получении объектаMiniVanо для методаMethodInfпосредствомTurboBoost(). Имея результирующий объектТуре.GetMethod(), можно вызватьMethodInfос помощью методаMiniVan.TurboBoost(). МетодInvoke()требует указания всех параметров, которые подлежат передаче методу, представленному объектомMethodInfо.Invoke(). Параметры задаются в виде массива объектовMethodInfо(т.к. они могут быть самыми разнообразными сущностями).System.ObjectПоскольку метод
не принимает параметров, можно просто передатьTurboBoost()(т.е. сообщить, что вызываемый метод не имеет параметров). Обновите методnullследующим образом:CreateUsingLateBinding()static void CreateUsingLateBinding(Assembly asm){try{// Получить метаданные для типа Minivan.Type miniVan = asm.GetType("CarLibrary.MiniVan");// Создать объект MiniVan на лету.object obj = Activator.CreateInstance(miniVan);Console.WriteLine($"Created a {obj} using late binding!");// Получить информацию о TurboBoost.