反射就是程序运行时,获取运行的类型信息。通俗的说,就是程序运行时,获取程序所用的类,dll文件等信息从而调用类,dll文件等中的属性和方法。(不过也有一点点疑惑,反射的功能貌似用其他的方式也能实现,为啥要用反射。。。)
下面的示例程序利用NET框架的三个内置类来使用反射:System.Reflection.Assembly,System.Type,和System.Activator
System.Reflection.Assembly类描述了.NET的程序集.在.NET中,程序集是配置单元.对于一个典型的Windows程序,程序集被配置为单一的Win32可执行文件,并且带有特定的附加信息,使之适应.NET运行环境.程序集也可以配置为Win32的DLL(动态链接库),同样需要带有.NET需要的附加信息.System.Reflection.Assembly类可以在运行的时候取得程序集的信息.这些信息包括程序集包含的类型信息.
System.Type类描述了类型定义.一个类型声明可以是一个类,接口,数组,结构体,或者枚举.在加载了一个类之后,System.Type类可以被用于枚举该类支持的方法,属性,事件和接口.
System.Activator类用于创建一个类的实例.
例如要获取程序中调用的类的文件信息:
eg :
//定义一个接口CalMoney
interface CalMoney
{
double getmoney()
}
//定义一个类class1继承于接口 CalMoney,里面包含两个属性Name和Money,一个方法getmoney()
struct class1 : CalMoney
{
public class1(string s)
{
}
string Name
double Money
double getmoney(string Number)
{...}
}
1、获取class1的type,三种方式(一般要加上命名空间,用Namespace.class1)
Type t = class1.GetType(); //
Type t = Type.GetType("class1") //Type t = Type.GetType("Namespace.class1")
Type t = Assembly.GetType("class1") //Type t = Assembly.GetType("Namespace.class1")
------------------------------------------------------------------------------------------------------------------------------
//如果是获取dll文件信息,可以采用以下方式:
System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFile(@"d:\Class1.dll"); //建立dll工程,工程文件里为class1,路径放在D盘下
Type t = ass.GetType("Namespace.class1");//必须使用名称空间+类名称
------------------------------------------------------------------------------------------------------------------------------
2、获取class1内部成员的信息
//获取类型的结构信息
constructorinfo[] myconstructors=t.GetConstructors;
//获取类型的字段信息
fieldinfo[] myfields=t.GetFiedls()
//获取方法信息
MethodInfo myMethodInfo=t.GetMethods();
//获取属性信息
propertyInfo[] myproperties=t.GetProperties
//获取事件信息
EventInfo[] Myevents=t.GetEvents;
3、调用class1内部的方法
3.1 已知class1中的内部方法
//构造器的参数
object[] constuctParms = new object[]{"ZhangFei"};
//根据类型创建对象
object dObj = Activator.CreateInstance(t,constuctParms);
//获取方法的信息
MethodInfo method = t.GetMethod("getmoney");
//调用方法的一些标志位,这里的含义是Public并且是实例方法,这也是默认的值
BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
//gemoney方法的参数
object[] parameters = new object[]{"100101"};
//调用方法,用一个object接收返回值
object returnValue = method.Invoke(dObj,flag,Type.DefaultBinder,parameters,null);
属性与方法的调用大同小异,大家也可以参考MSDN
3.2 判断class1中继承的接口(通过接口可以判断class1实现哪些方法)
if( t.GetInterface(“ CalMoney ”) !=null )
{
//通过接口调用函数
CalMoney CM=(CalMoney)System.Activator.CreateInstance(t);
CM.getmoney();
}
本文参考
http://zhangxuming.blog.51cto.com/1762/89529 入门
http://www.cnblogs.com/whxleem/articles/16895.html 入门
http://www.cnblogs.com/whxleem/articles/16896.html 实例
http://www.cnblogs.com/whxleem/articles/23800.html 实例
http://www.cnblogs.com/fineboy/archive/2006/10/10/525348.html 实例