三、反射(C#)

本节先介绍System.Type类,通过这个类可以访问关于任何数据类型的信息。然后简要介绍System.Reflection.Assembly类,它可以用于访问给定程序集的相关信息,或者把这个程序集加载到程序中。最后把本节的代码和上一节的代码结合起来,完成WhatsNewAttributes示例。

1. System.Type类

这里使用Type类只为了存储类型的引用:

Type t = typeof(double);

我们以前把Type看作一个类,但它实际上是一个抽象的基类。只要实例化了一个Type对象,实际上就实例化了Type的一个派生类。尽管一般情况下派生类只提供各种Type方法和属性的不同重载,但是这些方法和属性返回对应数据类型的正确数据,Type有与每种数据类型对应的派生类。它们一般不添加新的方法或属性。通常,获取指向任何给定类型的Type引用有3种常用方式:

  • 使用C#的typeof运算符,如上述代码所示。这个运算符的参数是类型的名称(但不放在引号中)。
  • 使用GetType()方法,所有的类都会从System.Object继承这个方法。
            double d = 10;
            Type t2 = d.GetType();

在一个变量上调用GetType()方法,而不是把类型的名称作为其参数。但要注意,返回的Type对象仍只与该数据类型相关:它不包含与该类型的实例相关的任何信息。如果引用了一个对象,但不能确保该对象实际上是哪个类的实例,GetType方法就很有用。

  • 还可以调用Type类的静态方法GetType():

Type t3 = Type.GetType("System.Double");

Type是许多反射功能的入口。它实现许多方法和属性,这里不可能列出所有的方法和属性,而主要介绍如何使用这个类。注意,可用的属性都是只读的:可以使用Type确定数据的类型,但不能使用它修改该类型!

a. Type属性

由Type实现的属性可以分为下述三类。首先,许多属性都可以获取包含与类相关的各种名称的字符串,如下表所示。

其次,属性还可以进一步获取Type对象的引用,这些引用表示相关的类,如下表所示。

 许多布尔属性表示这种类型是一个类,还是一个枚举等。这些特性包括IsAbstract、IsArray、IsClass、IsEnum、IsInterface、IsPointer、IsPrimitive(一种预定义的基元数据类型)、IsPublic、IsSealed以及IsValueType。例如,使用一种基元数据类型:

            Type intType = typeof(int);
            Console.WriteLine(intType.IsAbstract);//writes false
            Console.WriteLine(intType.IsClass);//writes false
            Console.WriteLine(intType.IsEnum);//writes false
            Console.WriteLine(intType.IsPrimitive);//writes true
            Console.WriteLine(intType.IsValueType);//writes true

或者使用Vector类:

            Type vecType = typeof(Vector);
            Console.WriteLine(vecType.IsAbstract);//writes false
            Console.WriteLine(vecType.IsClass);//writes true
            Console.WriteLine(vecType.IsEnum);//writes false
            Console.WriteLine(vecType.IsPrimitive);//writes false
            Console.WriteLine(vecType.IsValueType);//writes false

也可以获取在其中定义该类型的程序集引用,该引用作为System.Reflection.Assembly类的实例的一个引用来返回:

            Type t4 = typeof(Vector);
            Assembly containingAssembly = new Assembly(t4);//实例化时,编译器提示错误:无法创建抽象类或接口"Assembly"的实例

b. 方法

System.Type的大多数方法都用于获取对应数据类型的成员信息:构造函数、属性、方法和事件等。它有许多方法,但它们都有相同的模式。例如,有两个方法可以获取数据类型的方法的细节信息:GetMethod()和GetMethods()。GetMethod()方法返回System.Reflection.MethodInfo对象的一个引用,其中包含一个方法的细节信息。GetMethods()方法返回这种引用的一个数组。其区别是GetMethods()方法返回所有方法的细节信息;而GetMethod()返回一个方法的细节信息,其中该方法包含特定的参数列表。这两个方法都有重载方法,重载方法有一个附加的参数,即BindingFlags枚举值,该值表示应返回哪些成员,例如,返回公有成员、实例成员和静态成员。

例如,GetMethods()方法的最简单的一个重载方法不带参数,返回数据类型的所有公共方法的信息:


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值