Type类

Type

 

反射的作用

 

反射的作用有这么几个:查看和遍历类型和类型成员的元数据;动态创建类型实例,动态调用所创建的实例的方法,字段,属性;迟绑定(late-Binding)方法和属性.

 

 

获取Type对象实例

 

反射的核心是Type,这个类封装了类型的元数据,也是进行反射的入口.当获得了类型的Type对象后,就可以根据Type提供的属性和方法获取这个类型的一切信息,包括方法,字段,属性,事件,参数,构造函数等.获取已加载程序集中类型的Type对象,一般来说有以下三种方法:

(1).使用Type类提供的静态方法GetType()

 

GetType方法接受字符串形式的类型的名称,比如,想要获得Stream类型的Type实例,可以使用下面的代码:

Type t = Type.GetType("System.IO.Stream");



(2).使用typeof操作符

 

也可以使用C#提供的typeof操作符来完成这一操作:

Type t = typeof(System.IO.Stream);


这个时候有点像泛型,Stream就好像一个类型参数一样,传递到typeof操作符中.

 

(3).通过类型实例获得Type对象

 

还可以在类型实例上调用继承自System.ObjectGetType()方法来获得对象:

            string name = "asp.net mvc4";
            Type t = name.GetType();


使用这种方法时应该注意,返回的Type对象本身不包含关于特定对象的特定信息,比如”asp.net mvc4”.

 

 

Type类型以及System.Reflection命名空间的组织结构

 

到现在为止,已经多次提到过Type封装了类型的信息,那么这些类型信息都包含在哪些内容呢?假设现在有一个类型实例,它的名字叫做Demo,并且通过下面代码获取了对于他的Type类型的信息:

Type t = demo.GetType();        



现在,通过t,我们期望能够获得demo的哪些信息呢?

 

1.demo的类型的基本信息

(1).demo是什么类型的,也就是demo的类型名称?

(2).该类型位于什么命名空间下?

(3).他的基类型是什么?

...

 

Type提供了很多用于获取类型的基本信息.通过VS的智能提示就能略知一二,

 

2.demo的类型的成员信息

除了类型本身的信息以外,还要进一步知道他的成员信息:

(1).包括哪些字段,字段名称,类型,可访问性

(2).包括哪些属性,属性名称,类型,可访问性

(3).包括哪些构造函数,构造函数的名称,构造函数的参数个数,参数类型,参数名称.

...

 

System.Reflection命名空间下提供了FieldInfo类型,它封装了关于字段的所有信息.同理:

PropertyInfo类型,封装了类型的属性信息.

ConstructorInfo类型,封装了类型的构造函数信息.

MethodInfo类型,封装了类型的方法信息.

EventInfo类型,封装了类型的事件信息.

PrarmeterInfo类型,封装了类型的事件信息.

 

最后,注意到Type类型,以及所有以Info结尾的类型均继承自System.Reflection.MemberInfo类型,MemberInfo类型提供了获取类型基础信息的能力.

 

MemberInfo是一个抽象类,在获得一个MemberInfo对象后,并不知道它的实际类型是PropertyInfo还是FieldInfo.所以,需要提供方法进行判断,System.Reflection命名空间中,会遇到很多的位标记([]Flags)特性标记的枚举,称为位标记),MemberTypes,它用于标记成员类型,可能的取值如下:

    //
    // 摘要:
    //     标记每个已定义为 MemberInfo 的派生类的成员类型。
    [ComVisible(true)]
    [Flags]
    public enum MemberTypes
    {
        //
        // 摘要:
        //     指定该成员是一个构造函数,表示 System.Reflection.ConstructorInfo 成员。0x01 的十六进制值。
        Constructor = 1,
        //
        // 摘要:
        //     指定该成员是一个事件,表示 System.Reflection.EventInfo 成员。0x02 的十六进制值。
        Event = 2,
        //
        // 摘要:
        //     指定该成员是一个字段,表示 System.Reflection.FieldInfo 成员。0x04 的十六进制值。
        Field = 4,
        //
        // 摘要:
        //     指定该成员是一个方法,表示 System.Reflection.MethodInfo 成员。0x08 的十六进制值。
        Method = 8,
        //
        // 摘要:
        //     指定该成员是一个属性,表示 System.Reflection.PropertyInfo 成员。0x10 的十六进制值。
        Property = 16,
        //
        // 摘要:
        //     指定该成员是一种类型,表示 System.Reflection.MemberTypes.TypeInfo 成员。0x20 的十六进制值。
        TypeInfo = 32,
        //
        // 摘要:
        //     指定该成员是一个自定义成员类型。0x40 的十六进制值。
        Custom = 64,
        //
        // 摘要:
        //     指定该成员是一个嵌套类型,可扩展 System.Reflection.MemberInfo。
        NestedType = 128,
        //
        // 摘要:
        //     指定所有成员类型。
        All = 191
    }
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值