轻松学c#之运行时类型标识、反射

轻松学c#之运行时类型标识、反射

ID:21938009

大小:687.95 KB

页数:31页

时间:2018-10-21

轻松学c#之运行时类型标识、反射_第1页
轻松学c#之运行时类型标识、反射_第2页
轻松学c#之运行时类型标识、反射_第3页
轻松学c#之运行时类型标识、反射_第4页
轻松学c#之运行时类型标识、反射_第5页
资源描述:

《轻松学c#之运行时类型标识、反射》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第15章运行时类型标识、反射和特性运行时类型标识是一种在程序执行期间标识类型的机制。反射功能可以为用户提供类型的信息,从而使开发人员在运行时能够利用这些信息构造和使用对象。特性则用于描述C#程序中的元素的某种特性。特性同时使用了运行时类型标识和反射。本章将详细介绍这3个相互关联的功能。15.1运行时类型标识运行时类型标识(RTTI)可以在程序执行期间判定对象的类型。运行时类型标识还可以预先测试某个强制类型转化操作能否成功,从而避免无效的强制类型转换异常。运行时类型标识是反射机制的关键组成部分。在C#中支持运行时类型标识的关键字是is、as和typeof。15.1.1is运算

2、符测试类型通过is运算符能够判断对象的类型是否为特定类型。换句话说就是利用is运算符判断左右两边的类型是否相同或是兼容。is运算符只返回布尔类型。它的通用形式如下图所示。这里测试expr表达式描述的对象是否为type指定的类型。如果expr的类型与type指定的类型相同或兼容,那么结果为true,否则为false。如果结果为true,expr表达式就能够转换为type指定的类型。【示例15-1】以下使用is运算符判断类型是否相同。其中,由于b是B类型的对象,而B派生于A类型,因此b类型与A类型兼容。反之,就不成立。因为a对象属于A类型,而A类型不派生于B类型。所以a对象不能

3、转换为B类型。15.1.2as运算符一般我们都希望在程序运行期间执行转换,并且即使转换失败也不会抛出异常。这样,就需要使用as运算符。as运算符的通用形式如下图所示。其中,expr表达式将转换换为type指定的类型。如果转换成功,那么就返回一个type类型的引用,否则返回一个空引用。【示例15-2】以下代码利用as运算符避免无效的强制类型转换。其中,as语句先检查强制转换是否有效,如果有效,则执行强制转换过程。如果无效,则不执行强制转换。这样就不会产生异常。这里,由于a和B类型不兼容,转化失败,所以对象b为空引用。15.1.3typeof运算符typeof运算符可以返回与具

4、体类型相关的System.Type对象。通过System.Type对象,可以确定此类型的特性。typeof运算符的通用形式如下图所示。其中,type表示获得的类型,返回的Type对象封装了与type关联的信息。【示例15-3】以下程序使用typeof运算符获取StreamReader类型的Type对象的相关信息。其中,此程序调用了它的2个属性:FullName和IsClass。FullName属性可以返回类型的全称,IsClass属性在类型为一个类时返回真。15.2反射反射是一种允许用户获得类型信息的C#功能。它可以获取和使用只在运行时才能知道的类型的功能。许多支持反射的类

5、都位于System.Reflection命名空间中。因此,在使用反射的程序中通常包含以下代码:usingSystem.Reflection;15.2.1System.TypeSystem.Type类包装了类型,是整个反射子系统的核心。System.Type类包含了很多属性和方法,使用这些属性和方法可以在运行时得到类型的信息。Type类派生于System.Reflection.MemberInfo抽象类。MemberInfo类定义的只读属性如下表所示。属性功能TypeDeclaringType获取声明该成员的类或接口的类型MemberTypesMemberType获取成员的类

6、型。这个值用于指示该成员是字段、方法、属性、事件或构造函数intMetadataToken获取与特定元数据相关的值ModuleModule获取一个代表反射类型所在模块(可执行文件)的Module对象stringName成员的名称TypeReflectedType反射的对象的类型除了MemberInfo类定义的方法和属性,Type类还添加了许多自己的方法和属性。如下表所示是Type类定义的常用方法。方法功能ConstuctInfo[]GetConstructors()获取指定类型的构造函数列表EventInfo[]GetEvents()获取指定类型的事件列表FieldInfo

7、[]GetFields()获取指定类型的字段列表Type[]GetGenericArguments()获取与已构造的泛型类型绑定的类型实参列表,如果指定的类型是泛型类型定义,则获得类型形参。对于在在构造的类型,该列表就可能同时包含类型实参和类型形参MemberInfo[]GetMembers()获取指定类型的成员列表MethodInfo[]GetMethods()获取指定类型的方法列表PropertyInfo[]GetProperties()获取指定类型的属性列表Type类定义的只读属性如下表所示。属性功能Asse

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。