在.NET Framework中,程序集包含模块,而模块包含类型,类型有包含成员,反射则提供了封装程序集,模块和类型的对象.程序员可以使用反射动态地创建类型的实例将类型绑定到现有对象,或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性.使用反射可以:
1.获取模块(Module)信息
2.获取成员信息(MemberInfo)
3.获取类型(Type)信息
4.获取字段信息(FileInfo)
5.获取事件信息(EentInfo)
6.获取属性信息(PropertyInfo)
7.获取参数信息(ParameterInfo)
使用反射时,必须考虑程序的性能,总的来说,使用反射来调用类型或触发方法,或访问一个字段或属性是,CLR需要做更多的工作:校验参数,检查权限等,所以速度是非常慢的.
eg.TestReflection类在构造函数中获取了当前程序集.函数Page_Load通过实例化TestReflection类reflection,然后显示当前程序集的模块信息,类型信息,成员信息.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Reflection;
public partial class Default9 : System.Web.UI.Page
{
public class TestReflection
{
public Assembly myAssembly;
public TestReflection()
{
//获取程序集
myAssembly = Assembly.GetExecutingAssembly();
}
}
protected void Page_Load(object sender, EventArgs e)
{
TestReflection reflection = new TestReflection();
foreach (Module m in reflection.myAssembly.GetModules())
{
//输出模块信息
Response.Write("Module:" + m.Name + "<br>");
foreach (Type t in m.GetTypes())
{ //输出类型信息
Response.Write(" Type:" + t.Name + "<br>");
foreach (MemberInfo mi in t.GetMembers())
{ //输出成员信息
Response.Write(" MemberInfo:" + mi.Name + "<br>");
}
}
}
Response.End();
}
}