图解DotNet框架之五:System.Reflection

系统 1619 0

( 声明:本系列只想给大家介绍.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 />--> class Class2
{

private int x;
private int y;
public Class2( int a, int b)
{
x
= a;
y
= b;
}

public int Add()
{
return x + y;
}

}

元数据,请看代码注释

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> 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)
// -------------------------------------------------------
// FieldName:x(04000004) // /字段名
// Flags:[Private](00000001) // 访问修饰
// CallCnvntn:[FIELD]
// Fieldtype:I4 // 字段类型
//
// Field#2(04000005)
// -------------------------------------------------------
// FieldName:y(04000005)
// Flags:[Private](00000001)
// CallCnvntn:[FIELD]
// Fieldtype: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 // 返回类型
// 2Arguments
// Argument#1:I4
// Argument#2:I4
// 2Parameters // 参数列表
// (1)ParamToken:(08000003)Name:aflags:[none](00000000) // 参数类型
// (2)ParamToken:(08000004)Name:bflags:[none](00000000)
//
// Method#2(06000005)
// -------------------------------------------------------
// MethodName:Add(06000005)方法名
// Flags:[Public][HideBySig][ReuseSlot](00000086) // 访问修饰
// RVA:0x00002099
// ImplFlags:[IL][Managed](00000000)
// CallCnvntn:[DEFAULT]
// hasThis
// ReturnType:I4 // 返回类型
// Noarguments.
//

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

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

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 />--> Assemblyasm = Assembly.Load( " Test " ); // dll的名称
Typet = asm.GetType( " Test.Class2 " ); // 类的完全命名
object obj = Activator.CreateInstance(t); // 创建Class2的实例
MethodInfomi = t.GetMethod( " Add " ); // 获取Class2中Add方法的信息.
string s = ( string )mi.Invoke(obj, null ); // 执行方法,需要参数1:Class2的实例,2:方法的参数列表.

FieldInfopi
= t.GetField( " x " ); // 获取字段信息
pi.GetValue(obj); // 得到字段值

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

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

图解DotNet框架之五:System.Reflection


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论