反射可以不但用来读取元数据,还可以使用反射从编译时还不清楚的类型中动态创建程序集,此案例摘自C#高级编程。
首先先创建一个控制台应用程序,然后添加一个类库,类库名称为CalculatorLib,如下图所示:
CalculatorLib程序集中有两个方法,参数是x和y,一个方法返回两数之和,另一个方法返回两数之差,代码如下图所示:
namespace CalculatorLib
{public class Calculator{public double Add(double x, double y) => x + y;public double Subract(double x, double y) => x - y;}
}
接下来我们要在控制台车程序中实例化类Calculator,并调用其中的方法。控制台中的代码如下图所示:
class Program{private const string CalculatorLibPath = @"D:/MyProjects/MyConsoleApplication1/CalculatorLib/bin/Debug/CalculatorLib.dll";private const string CalculatorLibName = "CalculatorLib";private const string CalculatorTypeName = "CalculatorLib.Calculator";static void Main(string[] args){ReflectionOld();}public static object GetCalculator(){Assembly assembly = Assembly.LoadFile(CalculatorLibPath);//根据指定路径动态加载程序集return assembly.CreateInstance(CalculatorTypeName);//实例化程序集中的类}public static void ReflectionOld(){double x = 3;double y = 4;object calc = GetCalculator();object result = calc.GetType().GetMethod("Add").Invoke(calc, new object [] { x, y });object result2 = calc.GetType().GetMethod("Subract").Invoke(calc,new object[] { x,y});Console.WriteLine($"x + y = {result}");Console.WriteLine($"x - y = {result2}");Console.Read();}}
运行结果如下图所示:
第二种方式是利用dynamic进行,dynamic语法会比上面第一种方法简单,但是处理起来消耗更多的时间和资源。关于dynamic会在以后中学习。修改代码如下图所示:
class Program{private const string CalculatorLibPath = @"D:/MyProjects/MyConsoleApplication1/CalculatorLib/bin/Debug/CalculatorLib.dll";private const string CalculatorLibName = "CalculatorLib";private const string CalculatorTypeName = "CalculatorLib.Calculator";static void Main(string[] args){ReflectionNew();}public static object GetCalculator(){Assembly assembly = Assembly.LoadFile(CalculatorLibPath);//根据指定路径动态加载程序集return assembly.CreateInstance(CalculatorTypeName);//实例化程序集中的类}public static void ReflectionNew(){double x = 3;double y = 4;dynamic calc = GetCalculator();//类型为dynamicdouble result = calc.Add(x, y);Console.WriteLine($"x + y = {result}");double result2 = calc.Subract(x, y);Console.WriteLine($"x - y = {result}");Console.Read();}}
运行结果是一样的:
我个人认为反射是框架级的技术,由此案例为基础可以为以后组件式开发打下根基,并极大的降低程序的耦合,棒!