// Создать экземпляр MiniVan на лету и вызвать метод.
dynamic obj = Activator.CreateInstance(miniVan);
obj.TurboBoost();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
За счет объявления переменной obj
dynamic вся рутинная работа, связанная с рефлексией, перекладывается на DLR.Использование ключевого слова dynamic для передачи аргументов
Полезность среды DLR становится еще более очевидной, когда нужно выполнять вызовы методов с поздним связыванием, которые принимают параметры. В случае применения "многословных" обращений к рефлексии аргументы нуждаются в упаковке внутрь массива экземпляров object
Invoke() класса MethodInfo.Чтобы проиллюстрировать использование, создайте новый проект консольного приложения C# по имени LateBindingWithDynamic
MathLibrary. Переименуйте первоначальный файл Class1.cs в проекте MathLibrary на SimplaMath.cs и реализуйте класс, как показано ниже:namespace MathLibrary
{
public class SimpleMath
{
public int Add(int x, int y)
{
return x + y;
}
}
}
Модифицируйте содержимое файла MathLibrary.csproj
LateBindingWithDynamic):
"copy $(TargetPath) $(SolutionDir)LateBindingWithDynamic\$(OutDir)
$(TargetFileName) /Y
copy $(TargetPath)
$(SolutionDir)LateBindingWithDynamic\
$(TargetFileName) /Y" />
На заметку!
Если вы не знакомы с событиями при компиляции, тогда ищите подробные сведения в главе 17.Теперь возвратитесь к проекту LateBindingWithDynamic
System.Reflection и Microsoft.CSharp.RuntimeBinder в файл Program.cs. Добавьте в класс Program следующий метод, который вызывает метод Add() с применением типичных обращений к API-интерфейсу рефлексии:static void AddWithReflection()
{
Assembly asm = Assembly.LoadFrom("MathLibrary");
try
{
// Получить метаданные для типа SimpleMath.
Type math = asm.GetType("MathLibrary.SimpleMath");
// Создать объект SimpleMath на лету.
object obj = Activator.CreateInstance(math);
// Получить информацию о методе Add().
MethodInfo mi = math.GetMethod("Add");
// Вызвать метод (с параметрами).
object[] args = { 10, 70 };
Console.WriteLine("Result is: {0}", mi.Invoke(obj, args));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
Ниже показано, как можно упростить предыдущую логику, используя ключевое слово dynamic
private static void AddWithDynamic()
{
Assembly asm = Assembly.LoadFrom("MathLibrary");
try
{
// Получить метаданные для типа SimpleMath.
Type math = asm.GetType("MathLibrary.SimpleMath");
// Создать объект SimpleMath на лету.
dynamic obj = Activator.CreateInstance(math);
// Обратите внимание, насколько легко теперь вызывать метод Add().
Console.WriteLine("Result is: {0}", obj.Add(10, 70));
}
catch (RuntimeBinderException ex)
{
Console.WriteLine(ex.Message);
}
}