源文:http://www.cnblogs.com/xugao918/archive/2008/07/23/1249366.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等方法,基本上一个类型的所有信息都可以得到,很好很强大.呵呵.
在后续的文章中讲介绍各种应用程序的框架.......