您的位置:首页 > 其它

System.Reflection,.net中反射的核心类

2008-07-23 19:04 351 查看
源文:/article/5073182.html

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

System.Reflection,.net中反射的核心类.先来看图:



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

源代码:


class Class2






{




private int x;


private int y;


public Class2(int a, int b)






{


x = a;


y = b;


}


public int Add()






{


return x+y;


}


}

元数据,请看代码注释


TypeDef #2 (02000003)


// -------------------------------------------------------


// TypDefName: Class2 (02000003)


// Flags : [NestedPrivate] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit] (00100003)


// Extends : 01000002 [TypeRef] System.Object


// EnclosingClass : Test.Class1 (02000002)


// Field #1 (04000004)


// -------------------------------------------------------


// Field Name: x (04000004) ///字段名


// Flags : [Private] (00000001) //访问修饰


// CallCnvntn: [FIELD]


// Field type: I4 //字段类型


//


// Field #2 (04000005)


// -------------------------------------------------------


// Field Name: y (04000005)


// Flags : [Private] (00000001)


// CallCnvntn: [FIELD]


// Field type: I4


//


// Method #1 (06000004)


// -------------------------------------------------------


// MethodName: .ctor (06000004) ///构造函数


// Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] (00001886) //访问修饰


// RVA : 0x00002083


// ImplFlags : [IL] [Managed] (00000000) //CLR 托管代码


// CallCnvntn: [DEFAULT]


// hasThis


// ReturnType: Void //返回类型


// 2 Arguments


// Argument #1: I4


// Argument #2: I4


// 2 Parameters //参数列表


// (1) ParamToken : (08000003) Name : a flags: [none] (00000000) //参数类型


// (2) ParamToken : (08000004) Name : b flags: [none] (00000000)


//


// Method #2 (06000005)


// -------------------------------------------------------


// MethodName: Add (06000005) 方法名


// Flags : [Public] [HideBySig] [ReuseSlot] (00000086) //访问修饰


// RVA : 0x00002099


// ImplFlags : [IL] [Managed] (00000000)


// CallCnvntn: [DEFAULT]


// hasThis


// ReturnType: I4 //返回类型


// No arguments.


//

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


AssemblyRef #1 (23000001)


// -------------------------------------------------------


// Token: 0x23000001


// Public Key or Token: b7 7a 5c 56 19 34 e0 89


// Name: mscorlib


// Version: 2.0.0.0


// Major Version: 0x00000002


// Minor Version: 0x00000000


// Build Number: 0x00000000


// Revision Number: 0x00000000


// Locale: <null>


// HashValue Blob:


// Flags: [none] (00000000)


//


//

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

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

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

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

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

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


Assembly asm = Assembly.Load("Test");//dll的名称


Type t = asm.GetType("Test.Class2");//类的完全命名


object obj = Activator.CreateInstance(t); //创建Class2的实例


MethodInfo mi = t.GetMethod("Add");//获取Class2中Add方法的信息.


string s = (string)mi.Invoke(obj,null);//执行方法,需要参数1:Class2的实例,2:方法的参数列表.




FieldInfo pi = t.GetField("x"); //获取字段信息


pi.GetValue(obj); //得到字段值

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

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

在后续的文章中讲介绍各种应用程序的框架.......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: