动态的实例化首先要创建实例:
接下来我们创建一个类库,并定义一个实力类
namespace CalculatorLib
{
public class Calculator
{
public double Add(double x, double y) => x + y;
public double Subtract(double x, double y) => x - y;
}
}
创建完成后生成dll引用;
用反射的API调用成员:使用反射调用方法的优点是,类型不需要再编译期间可用。只要把库复制到指定的目录中,就可以在稍后添加它;
用动态类型调用成员:需要用到dynamic关键字;
接下来看具体的实现方式
private const string CalculatorLibPath = @"D:\Users\chenss\source\repos\Solution1\CalculatorLib\bin\Debug\CalculatorLib.dll";
private const string CalculatorLibName = "CalculatorLib";
private const string CalculatorTypeName = "CalculatorLib.Calculator";
static void Main(string[] args)
{
ReflectionOld();
ReflectionNew();
ReflectionException();
Console.ReadLine();
}
/// <summary>
/// 实例化
/// </summary>
/// <returns></returns>
private static object GetCalculator()
{
Assembly assembly = Assembly.LoadFile(CalculatorLibPath);
return assembly.CreateInstance(CalculatorTypeName);
}
/// <summary>
/// 反射api调用
/// </summary>
private static void ReflectionOld()
{
double x = 3;
double y = 4;
object calc = GetCalculator();
object result = calc.GetType().GetMethod("Add").Invoke(calc, new object[] { x, y });
Console.WriteLine($"the result of {x} and {y} is {result}");
}
/// <summary>
/// 动态调用
/// </summary>
private static void ReflectionNew()
{
double x = 3;
double y = 4;
dynamic calc = GetCalculator();
double result = calc.Add(x,y);
Console.WriteLine($"the result of {x} and {y} is {result}");
}