反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。
应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。
程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途。
①使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。 ②使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 ③使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。 ④使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。 ⑤使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。 ⑥使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。 ⑦使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。 ⑧使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
示例代码:
using System; using System.Collections.Generic; using System.Text; using System.Reflection;
namespace myReflection { class Program { static void Main(string[] args) { Master ma = new Master(); Type tp = ma.GetType(); MethodInfo [] MI = tp.GetMethods(); foreach (MethodInfo mm in MI) { Console.WriteLine(mm.Name); } } }
class Student { private string stuName;
public string StuName { get { return stuName; } set { stuName = value; } } private int stuAge;
public int StuAge { get { return stuAge; } set { stuAge = value; } } public void study() { Console.WriteLine("学习!"); } }
class Master:Student { public void Say() { Console.WriteLine("硕士....."); } } }
输出的结果为:Say,get_StuName,set_StuName,get_StuAge,set_StuAge,study //这里是我自己写的方法和属性系统把属性也当做方法输出了
GetType,ToString,Equals,GetHashCode //这里是继承的 Object的方法。 |