第14章动态类型和特性 ■14.1动态类型 引用类型变量或者指针可以指示一个对象,也可以指示该类的派 生类对象,所以有时必须要在运行时确定对象的类型,这就是所 谓的动态类型确定,C#中可以使用 typeof运算符、 Get Type方法 和is运算符等工具动态地获取类型、方法、属性等信息
第14章 动态类型和特性 引用类型变量或者指针可以指示一个对象,也可以指示该类的派 生类对象,所以有时必须要在运行时确定对象的类型,这就是所 谓的动态类型确定,C#中可以使用typeof运算符、GetType方法 和is运算符等工具动态地获取类型、方法、属性等信息。 ◼ 14.1 动态类型
14.1.1 typeof运算符和 GetType方法 14.1.1.1 typeof运算符 对于任何一个类型,运用 typed运算符,能够获得一个类型的详 细信息, typeof表达式有两种基本格式: typeof(类型) typeof void) 14.1.12 Get Type方法 使用 Get Type方法获得类型信息,基本的调用格式是: 对象 Get Type0
14.1.1 typeof运算符和GetType方法 对于任何一个类型,运用typeof运算符,能够获得一个类型的详 细信息,typeof表达式有两种基本格式: typeof (类型) typeof ( void ) ◼ 14.1.1 .1 typeof运算符 ◼ 14.1.1 .2 GetType方法 使用GetType方法获得类型信息,基本的调用格式是: 对象.GetType ()
14.1.2 MemberInfo类 MemberInfo类的全称是 System Reflection MemberInfo类,用于获取类的 成员(构造函数、事件、字段、方法和属性等)信息的抽象基类。它继承 Object,并且派生出许多重要的类,层次结构为 System Object System Reflection MemberInfo System Reflection. Eventlnfo System Reflection FieldInfo System Reflection. Method Base System Reflection Property Info System Type 从 Method Base类中派生两个很重要的类: System Reflection. ConstructorInfo System Reflection MethodInfo 口公共属性 口公共方法
14.1.2 MemberInfo类 MemberInfo类的全称是System.Reflection.MemberInfo类,用于获取类的 成员(构造函数、事件、字段、方法和属性等)信息的抽象基类。它继承 Object,并且派生出许多重要的类,层次结构为: System.Object System.Reflection.MemberInfo System.Reflection.EventInfo System.Reflection.FieldInfo System.Reflection.MethodBase System.Reflection.PropertyInfo System.Type 从MethodBase类中派生两个很重要的类: System.Reflection.ConstructorInfo System.Reflection.MethodInfo ❑ 公共属性 ❑ 公共方法
14.1.3 System.Type类 通过 typeof运算符或者从 Get Type方法获得的是 System Type类的 对象。Type类处于 System Reflection命名空间,Type类继承了 MemberInfo类和 Reflect接口。使用Type类应该先引入 System Reflection命名空间。使用Type的成员可以获取关于类型 声明、构造函数、方法、字段、属性和事件,以及该类所属的模 块和程序集。 Type类有很多的成员,在此仅介绍其中若干常用的成员。 口公共属性 口公共方法
14.1.3 System.Type类 通过typeof运算符或者从GetType方法获得的是System.Type类的 对象。Type类处于System.Reflection命名空间,Type类继承了 MemberInfo 类 和 IReflect 接 口 。 使 用 Type 类应该先引入 System.Reflection命名空间。使用Type的成员可以获取关于类型 声明、构造函数、方法、字段、属性和事件,以及该类所属的模 块和程序集。 Type类有很多的成员,在此仅介绍其中若干常用的成员。 ❑ 公共属性 ❑ 公共方法
14.1.4is运算符 is运算符用于检查对象运行时的类型是否与给定类型兼容。使用is运 算符的格式如下: e is t 其中e是表达式,T是类型,运算的结果是boo值。表示e的类型是否 可以通过引用转换、装箱或者拆箱转换成为T。 请注意,在讨论运算符is时,我们所说的转换,仅仅是指引用转换、 装箱和拆箱所引起的类型转换,其它的转换,如,用户自定义的转换 不能使用is运算符
14.1.4 is运算符 is运算符用于检查对象运行时的类型是否与给定类型兼容。使用is运 算符的格式如下: e is T 其中e是表达式,T是类型,运算的结果是bool值。表示e的类型是否 可以通过引用转换、装箱或者拆箱转换成为T。 请注意,在讨论运算符is时,我们所说的转换,仅仅是指引用转换、 装箱和拆箱所引起的类型转换,其它的转换,如,用户自定义的转换 不能使用is运算符
14.1.5反射 反射( reflection)是一种动态程序组织和管理技术。反射提供 了封装程序集、模块和类型的对象,可以使用反射动态地创建 类型的实例,将类型绑定到现有对象,或从现有对象中获取类 型,并且调用类型的方法或访问它的字段、属性等
14.1.5 反射 反射(reflection)是一种动态程序组织和管理技术。反射提供 了封装程序集、模块和类型的对象,可以使用反射动态地创建 类型的实例,将类型绑定到现有对象,或从现有对象中获取类 型,并且调用类型的方法或访问它的字段、属性等
14.2特性 ■142.1使用系统定义的特性 1421.1使用 ObsoleteAttribute 1421.2使用 Conditiona| Attribute 其作用是标记一个方法,以此决定该方法是否被执行,使用 ConditionalAttribute要求用预编译指令# define定义一个标号,这个标号如 果和条件特性的参数一致,那么该条件特性所标记的方法就可以被执行,否 则将被忽略。 1421.3在程序集级别应用特性 如果要在程序集级别应用特性,应使用 Assembly关键字
14.2 特性 14.2.1.1 使用ObsoleteAttribute 14.2.1.2 使用ConditionalAttribute 其 作 用 是 标 记 一 个 方 法 , 以 此 决 定 该 方 法 是 否 被 执 行 , 使 用 ConditionalAttribute要求用预编译指令#define定义一个标号,这个标号如 果和条件特性的参数一致,那么该条件特性所标记的方法就可以被执行,否 则将被忽略。 14.2.1.3 在程序集级别应用特性 如果要在程序集级别应用特性,应使用Assembly关键字。 ◼ 14.2.1 使用系统定义的特性
1422自定义特性 ,,2, ■1422.1声明自定义的特性类 [AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited)] 其中: validon用来指定特性可以关联的语言成分,它是 Attribute Targets值 的组合。 Attribute Targets是一个枚举,默认值为 Attribute Targets. All ■14222使用自定义的特性类 使用特性要将定义好的特性与程序中的成分关联,关联就是将特性类的构造 函数用[]括起来,然后置于程序的成分前面,如果有多个特性要加在成分之 上,可以用多个[],也可以在一个[]中用逗号分隔 ■1422.3通过反射访问特性 使用反射可以査询特性,具体的査询运算通过调用 System Reflection. Member info类中的 GetCustomAttributes方法来实现
14.2.2 自定义特性 [AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited)] 其中:validon用来指定特性可以关联的语言成分,它是AttributeTargets值 的组合。AttributeTargets是一个枚举,默认值为AttributeTargets.All。 ◼ 14.2.2.1 声明自定义的特性类 使用特性要将定义好的特性与程序中的成分关联,关联就是将特性类的构造 函数用[ ]括起来,然后置于程序的成分前面,如果有多个特性要加在成分之 上,可以用多个[ ],也可以在一个[ ]中用逗号分隔。 ◼ 14.2.2.2 使用自定义的特性类 使用反射可以查询特性,具体的查询运算通过调用 System.Reflection.MemberInfo类中的GetCustomAttributes方法来实现。 ◼ 14.2.2.3 通过反射访问特性