(声明:本系列只想给大家介绍.net框架,并不是语法和类的使用的讲解,所以只能概括的描述一下所提到的类,如果有疑问可以到MSDN上面去查)

这篇文章我们来学习System.Reflection,.net中反射的核心类.先来看图:

图解DotNet框架之五:System.Reflection

前面的文章,我们说过.net的元数据可以完整地描述类型,那么通过System.Reflection,可以在运行时发现类型格式,我们来看一下元数据:

源代码:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->图解DotNet框架之五:System.ReflectionclassClass2
图解DotNet框架之五:System.Reflection图解DotNet框架之五:System.Reflection
图解DotNet框架之五:System.Reflection{
图解DotNet框架之五:System.Reflection
图解DotNet框架之五:System.Reflection
privateintx;
图解DotNet框架之五:System.Reflection
privateinty;
图解DotNet框架之五:System.Reflection
publicClass2(inta,intb)
图解DotNet框架之五:System.Reflection图解DotNet框架之五:System.Reflection
图解DotNet框架之五:System.Reflection{
图解DotNet框架之五:System.Reflectionx
=a;
图解DotNet框架之五:System.Reflectiony
=b;
图解DotNet框架之五:System.Reflection}

图解DotNet框架之五:System.Reflection
publicintAdd()
图解DotNet框架之五:System.Reflection图解DotNet框架之五:System.Reflection
图解DotNet框架之五:System.Reflection{
图解DotNet框架之五:System.Reflection
returnx+y;
图解DotNet框架之五:System.Reflection}

图解DotNet框架之五:System.Reflection}

元数据,请看代码注释

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->图解DotNet框架之五:System.ReflectionTypeDef#2(02000003)
图解DotNet框架之五:System.Reflection
//-------------------------------------------------------
图解DotNet框架之五:System.Reflection
//TypDefName:Class2(02000003)
图解DotNet框架之五:System.Reflection
//Flags:[NestedPrivate][AutoLayout][Class][AnsiClass][BeforeFieldInit](00100003)
图解DotNet框架之五:System.Reflection
//Extends:01000002[TypeRef]System.Object
图解DotNet框架之五:System.Reflection
//EnclosingClass:Test.Class1(02000002)
图解DotNet框架之五:System.Reflection
//Field#1(04000004)
图解DotNet框架之五:System.Reflection
//-------------------------------------------------------
图解DotNet框架之五:System.Reflection
//FieldName:x(04000004)///字段名
图解DotNet框架之五:System.Reflection
//Flags:[Private](00000001)//访问修饰
图解DotNet框架之五:System.Reflection
//CallCnvntn:[FIELD]
图解DotNet框架之五:System.Reflection
//Fieldtype:I4//字段类型
图解DotNet框架之五:System.Reflection
//
图解DotNet框架之五:System.Reflection
//Field#2(04000005)
图解DotNet框架之五:System.Reflection
//-------------------------------------------------------
图解DotNet框架之五:System.Reflection
//FieldName:y(04000005)
图解DotNet框架之五:System.Reflection
//Flags:[Private](00000001)
图解DotNet框架之五:System.Reflection
//CallCnvntn:[FIELD]
图解DotNet框架之五:System.Reflection
//Fieldtype:I4
图解DotNet框架之五:System.Reflection
//
图解DotNet框架之五:System.Reflection
//Method#1(06000004)
图解DotNet框架之五:System.Reflection
//-------------------------------------------------------
图解DotNet框架之五:System.Reflection
//MethodName:.ctor(06000004)///构造函数
图解DotNet框架之五:System.Reflection
//Flags:[Public][HideBySig][ReuseSlot][SpecialName][RTSpecialName][.ctor](00001886)//访问修饰
图解DotNet框架之五:System.Reflection
//RVA:0x00002083
图解DotNet框架之五:System.Reflection
//ImplFlags:[IL][Managed](00000000)//CLR托管代码
图解DotNet框架之五:System.Reflection
//CallCnvntn:[DEFAULT]
图解DotNet框架之五:System.Reflection
//hasThis
图解DotNet框架之五:System.Reflection
//ReturnType:Void//返回类型
图解DotNet框架之五:System.Reflection
//2Arguments
图解DotNet框架之五:System.Reflection
//Argument#1:I4
图解DotNet框架之五:System.Reflection
//Argument#2:I4
图解DotNet框架之五:System.Reflection
//2Parameters//参数列表
图解DotNet框架之五:System.Reflection
//(1)ParamToken:(08000003)Name:aflags:[none](00000000)//参数类型
图解DotNet框架之五:System.Reflection
//(2)ParamToken:(08000004)Name:bflags:[none](00000000)
图解DotNet框架之五:System.Reflection
//
图解DotNet框架之五:System.Reflection
//Method#2(06000005)
图解DotNet框架之五:System.Reflection
//-------------------------------------------------------
图解DotNet框架之五:System.Reflection
//MethodName:Add(06000005)方法名
图解DotNet框架之五:System.Reflection
//Flags:[Public][HideBySig][ReuseSlot](00000086)//访问修饰
图解DotNet框架之五:System.Reflection
//RVA:0x00002099
图解DotNet框架之五:System.Reflection
//ImplFlags:[IL][Managed](00000000)
图解DotNet框架之五:System.Reflection
//CallCnvntn:[DEFAULT]
图解DotNet框架之五:System.Reflection
//hasThis
图解DotNet框架之五:System.Reflection
//ReturnType:I4//返回类型
图解DotNet框架之五:System.Reflection
//Noarguments.
图解DotNet框架之五:System.Reflection
//

我们看到在元数据种非常详细的定义了一个类中的任何成员,还包括了程序集所引用的其他程序集的信息

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->图解DotNet框架之五:System.ReflectionAssemblyRef#1(23000001)
图解DotNet框架之五:System.Reflection
//-------------------------------------------------------
图解DotNet框架之五:System.Reflection
//Token:0x23000001
图解DotNet框架之五:System.Reflection
//PublicKeyorToken:b77a5c561934e089
图解DotNet框架之五:System.Reflection
//Name:mscorlib
图解DotNet框架之五:System.Reflection
//Version:2.0.0.0
图解DotNet框架之五:System.Reflection
//MajorVersion:0x00000002
图解DotNet框架之五:System.Reflection
//MinorVersion:0x00000000
图解DotNet框架之五:System.Reflection
//BuildNumber:0x00000000
图解DotNet框架之五:System.Reflection
//RevisionNumber:0x00000000
图解DotNet框架之五:System.Reflection
//Locale:<null>
图解DotNet框架之五:System.Reflection
//HashValueBlob:
图解DotNet框架之五:System.Reflection
//Flags:[none](00000000)
图解DotNet框架之五:System.Reflection
//
图解DotNet框架之五:System.Reflection
//

OK,了解了元数据,我们现在来看看上面图中,那些类的基本功能,.NetFrameWork库类的层次程序集包含模块,模块包含类型,类型又包含成员(方法,属性,字段,事件等)。

1.Assembly:主要是加载和操纵一个程序集.

2.ParameterInfo:该类保存给定参数的信息,也就是说方法的参数,可以用该类来操作.

3.Module:访问带有多文件程序集的给定模块,可以认为就是命名空间.

4.MemberInfo:该类是抽象基类,为他的子类定义了公共的行为.如MemberTypes,MemberName等.而他的子类则分别是方法,属性,字段,事件等信息的具体实现.

那么这些类如何来完成类型的反射呢?

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->图解DotNet框架之五:System.ReflectionAssemblyasm=Assembly.Load("Test");//dll的名称
图解DotNet框架之五:System.Reflection
Typet=asm.GetType("Test.Class2");//类的完全命名
图解DotNet框架之五:System.Reflection
objectobj=Activator.CreateInstance(t);//创建Class2的实例
图解DotNet框架之五:System.Reflection
MethodInfomi=t.GetMethod("Add");//获取Class2中Add方法的信息.
图解DotNet框架之五:System.Reflection
strings=(string)mi.Invoke(obj,null);//执行方法,需要参数1:Class2的实例,2:方法的参数列表.
图解DotNet框架之五:System.Reflection

图解DotNet框架之五:System.ReflectionFieldInfopi
=t.GetField("x");//获取字段信息
图解DotNet框架之五:System.Reflection
pi.GetValue(obj);//得到字段值

事件和属性的反射调用,同上述代码差不多,不再赘述.上面的代码中我们使用了Type这个类型,这里做一下简单的介绍

System.Type定义了大量的成员,可以用来检查一个类型的元数据,如GetMethod,GetFields等方法,基本上一个类型的所有信息都可以得到,很好很强大.呵呵.

相关文章: