简单来说,反射就是让程序在运行时能'看见'并操作自己的结构。通过它,我们可以访问和使用一个 DLL 里面所有的东西,实现运行时的动态调用,而不是普通编译时的绑定。这让程序更加自由灵活,但代价是性能会稍低一些。
反射通常用于插件开发、特性(Attribute)处理以及程序的动态调用等场景。
环境搭建
为了演示这个特性,我们通常需要两个工程:一个用来生成 DLL 的类库项目,另一个是控制台应用程序。我们将通过反射的方式,在控制台中调用类库里的代码。
1. 类库项目
首先创建一个输出为类库的项目,定义几个基础方法供后续调用。
using System;
namespace ClassLibrary1
{
public class Class1
{
public Class1()
{
Console.WriteLine("无参构造");
}
public Class1(string a)
{
Console.WriteLine("有参构造");
}
public string A(int a, int b)
{
return "有参数有返回值:" + (a + b);
}
public void B(int a, int b)
{
Console.WriteLine("有参数无返回值:" + (a + b));
}
public void C()
{
Console.WriteLine("无参无返回值");
}
}
}
2. 控制台项目调用
接下来在控制台项目中引入 System.Reflection 命名空间。这里我们覆盖了四种典型场景:带参构造、有参有返回值方法、有参无返回值方法、无参无返回值方法。
System;
System.Reflection;
{
{
{
Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + );
Type type = assembly.GetType();
ConstructorInfo info2 = type.GetConstructor( Type[] { () });
info2.Invoke( [] { });
Console.WriteLine();
Type type1 = assembly.GetType();
MethodInfo mi1 = type1.GetMethod();
Object obj1 = Activator.CreateInstance(type1);
[] objParams1 = [] { , };
Object returnValue = mi1.Invoke(obj1, objParams1);
Console.WriteLine(returnValue);
Console.WriteLine();
Type type2 = assembly.GetType();
MethodInfo mi2 = type2.GetMethod();
Object obj2 = Activator.CreateInstance(type2);
[] objParams2 = [] { , };
mi2.Invoke(obj2, objParams2);
Console.WriteLine();
Type type3 = assembly.GetType();
MethodInfo mi3 = type3.GetMethod();
Object obj3 = Activator.CreateInstance(type3);
mi3.Invoke(obj3, );
Console.ReadKey();
}
}
}


