什么是反射?
反射提供了封装程序集、模块和类型的对象(Type类型)
反射的用途
检查和实例化程序集中的类型
在运行时构建新类型
执行后期绑定,访问在运行时创建的类型的方法
命名空间:System.Reflection
Type类
Type代表类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开发或封闭构造的泛型类型
Type是System.Reflection功能的根,是访问元数据的主要方式
可以使用Type的成员获取关于类型声明的信息,如构造函数、方法、字段、属性和类的事件
类
值类型
数组
接口
指针
枚举
构造泛型类型和泛型类型定义
构造泛型类型、泛型乐讯定义和泛型方法定义的类型实参和类型形参
Demo:
mscorlib.dll是.NET中一个最主要的程序集之一,现在我们来查看该程序集中的所有类型。
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = a.FullName; //获取程序集名称
Label1.Text += "<br>" + a.GetType().ToString();
}
protected void Button1_Click(object sender, EventArgs e)
{
Type[] T = a.GetTypes();
int count = a.GetTypes().Length;
for (int i = 0; i < count; i++)
{
Response.Write(T[i].FullName + "<br>");
}
}
Users 是ClassLibrary.dll程序集中的一个类,并且在该类中存在一个Say方法,下面我来看如何动态调用该程序集中的Say方法。
{
Assembly ab = Assembly.LoadFrom(@"D:/ClassLibrary.dll");
//获取程序集类型
Type newObject = ab.GetType("ClassLibrary.Users");
//创建动态加载程序集的实例
object myObject = Activator.CreateInstance(newObject);
//获取动态程序集的方法
MethodInfo info=newObject.GetMethod("Say");
//执行该方法
info.Invoke(myObject, null);
}