C#中反射理解

一、C#中反射理解

        反射是一种机制,通过这种机制可以知道一个未知类型的类型信息。

  有一个对象,它不是我们定义的,既可能是通过网络捕捉到的,也可能是使用泛型定义的,但我们想知道这个对象的类型信息,想知道这个对象有哪些方法或者属性什么的,甚至想进一步调用这个对象的方法。关键是现在只知道它是一个对象,不知道它的类型,自然不会知道它有哪些方法等信息,这时该怎么办呢?

  反射机制就是解决这么一个问题的,通过反射机制就可以知道未知类型对象的类型信息。

      反射提供了封装程序集、模块和类型的对象(Type类型),可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

   归纳起来,反射在下列情况下很有用:

      需要访问程序元数据的属性。
      检查和实例化程序集中的类型。
      在运行时构建新类型。
      执行后期绑定,访问在运行时创建的类型的方法。
二、反射中常用的类

1. Type

  System.Reflection是反射的命名空间,而Type类为System.Reflection功能的根,也是访问元数据的主要方式。Type类表示类型声明,包括类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。

公共属性

说明

sAbstract

获取一个值,通过该值指示Type是否为抽象的并且必须被重写

IsArray

获取一个值,通过该值指示Type是否为数组

IsByRef

获取一个值,通过该值指示Type是否由引用传递

sClass

获取一个值,通过该值指示Type是否是一个类,即不是值类型或接口

IsInterface

获取一个值,通过该值指示Type是否为接口,即不是类或值类型

IsSubclassOf

确定当前Type表示的类是否是从指定的Type表示的类派生的

MakeArrayType

返回一个表示当前类型的一维数组(下限为零)的Type对象

Module

获取在其中定义当前Type的模块

Name

获取当前成员的名称

Namespace

获取Type的命名空间

ReflectedType

获取用于获取该成员的类对象

2、方法

记得在基地时候这样做的

归纳起来,得到一个Type实例的三种方法如下:

  (1)使用System.Object.GetType(),例如:

  Person pe=new Person();  //定义pe为person类的一个对象

  Type t=pe.GetType();

  这样t为pe的Type对象。

  (2)使用System.Type.GetType()静态方法,参数为类型的完全限定名。例如:

  Type t=Type.GetType("MyNs.Person");

  其中,MyNs.Person为MyNs命名空间中的Person类,这样t为该类的Type对象。

(3)使用typeof运算符,例如:

  Type t=typeof(Person);

  其中Person为一个类,这样t为该类的Type对象。

2. System.Reflection反射命名空间

  System.Reflection反射命名空间包含提供加载类型、方法和字段的有组织的视图的类和接口,具有动态创建和调用类型的功能。其中主要的类及其功能如下:

Assembly类:通过它可以加载、了解和操作一个程序集。
AssemblyName类:通过它可以找到大量隐藏在程序集的身份中的信息,如版本信息、区域信息等。
ConstructorInfo类:用于发现构造函数及调用构造函数。通过对ConstructorInfo调用Invoke来创建对象,其中ConstructorInfo是由Type对象的GetConstructors或GetConstructor方法返回的。
EventInfo类:通过它可以找到事件的信息。
 
FieldInfo类:通过它可以找到字段的信息。
MethodInfo类:通过它可以找到方法的信息。
ParameterInfo类:通过它可以找到参数的信息。
PropertyInfo类:通过它可以找到属性的信息。
MemberInfo类:它是一个抽象基类,为EventInfo、FieldInfo、MethodInfo、PropertyInfo等类型定义了公共的行为。
Module类:用来访问带有多文件程序集的给定模块。
DefaultMemberAttribute类:定义某类型的成员,该成员是InvokeMember使用的默认成员。
其中重要的Assembly类,它的常用属性和常用方法如下。
 
 
方法
 

补充:以前我们必须知道一个类的完整定义,才可以使用这个类。采用反射技术:

 

 
反射的基础性概念复习完毕!2013/3/11

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值