在.NET运行时了解类型信息(1)

原创 2002年04月18日 09:26:00

通过反射命名空间中的类以及 System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如类、接口和值类型)的信息。您也可以使用反射在运行时创建类型实例,然后调用和访问这些实例。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


反射概述


公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。


程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途:



  • 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。


  • 使用 Module 了解如下的类似信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。


  • 使用 ConstructorInfo 了解如下的类似信息:构造函数的名称、参数、访问修饰符(如 publicprivate)和实现详细信息(如 abstractvirtual)等。使用 Type 对象的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。


  • 使用 MethodInfo 来了解如下的类似信息:方法的名称、返回类型、参数、访问修饰符(如 publicprivate)和实现详细信息(如 abstractvirtual)等。使用 Type 对象的 GetMethods 或 GetMethod 方法来调用特定的方法。


  • 使用 FieldInfo 来了解如下的类似信息:字段的名称、访问修饰符(如 publicprivate)和实现详细信息(如 static)等;并获取或设置字段值。


  • 使用 EventInfo 来了解如下的类似信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。


  • 使用 PropertyInfo 来了解如下的类似信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。


  • 使用 ParameterInfo 来了解如下的类似信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。


System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时构造类型。


反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。


反射还有其他一些用途。JScript 等语言编译器使用反射来构造符号表。System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要持久保存的字段。System.Runtime.Remoting 命名空间中的类通过序列化来间接地使用反射。


查看类型信息


System.Type 类对于反射起着核心的作用。当反射请求加载的类型时,公共语言运行库将为它创建一个 Type 对象。您可以使用 Type 对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。


在使用 Assembly.GetType 或 Assembly.GetTypes 时传入所需类型的名称,可以从尚未加载的程序集中获取 Type 对象。使用 Type.GetType 可从已加载的程序集中获取 Type 对象。使用 Module.GetType 和 Module.GetTypes 可获取模块 Type 对象。


以下代码示例显示在获取程序集的 Assembly 对象和模块时所必需的语法。


以下示例代码说明如何从已加载的程序集中获取 Type 对象。


获取 Type 对象之后,可以通过多种方法来了解有关该类型成员的信息。例如,通过调用 Type.GetMembers 方法(该方法将获取对当前类型的每个成员进行描述的一组 MemberInfo 对象),您可以获取有关该类型的所有成员的信息。


您也可以在 Type 类上使用方法,以检索有关按名称指定的一个或多个构造函数、方法、事件、字段或属性的信息。例如,Type.GetConstructor 封装当前类的特定构造函数。


如果具有 Type 对象,则可以使用 Type.Module 属性来获取一个封装该类型所在模块的对象。使用 Module.Assembly 属性可查找封装模块所在程序集的对象。使用 Type.Assembly 属性可直接获取封装类型的程序集。


System.Type 和 ConstructorInfo


以下代码示例显示如何列出一个类(此示例中为 String 类)的构造函数。


MemberInfo、MethodInfo、FieldInfo 和 PropertyInfo


使用 MemberInfo、MethodInfo、FieldInfo 或 PropertyInfo 对象可获取有关类型的方法、属性、事件、字段的信息。


以下代码示例使用 MemberInfo 来列出 System.IO.File 类中的成员数量并使用 System.Type.IsPublic 属性来确定该类的可见性。


以下代码示例调查指定成员的类型。它对 MemberInfo 类的一个成员执行反射,然后列出其类型。


以下示例代码使用所有的反射 *Info 类以及 BindingFlags 来列出指定类的所有成员(构造函数、字段、属性、事件和方法),并将这些成员划分为静态和实例类别。

在.NET运行时了解类型信息(3)

访问自定义属性当属性与程序元素相关联后,可以使用反射来查询它们是否存在以及它们的值。用于查询属性的主要反射方法包含在 System.Reflection.MemberInfo.GetCustomAtt...
  • Paul_Ni
  • Paul_Ni
  • 2002年04月17日 09:03
  • 740

在.NET运行时了解类型信息(2)

反射类所使用的设计模式System.Reflection 类中最常用的方法都使用统一的模式。Module、Type 和 MemberInfo 类的成员使用下表中所示的设计模式。成员签名说明MyInst...
  • Paul_Ni
  • Paul_Ni
  • 2002年04月17日 09:03
  • 813

运行时类型信息

RTTI(在运行时,识别一个对象的类型)可以在程序运行时发现和使用类型信息,这就打破了只能在编译期执行面向类型的操作的限制。使用它,可以查询某个Shape引用所指向的对象的确切类型,然后选择或者剔除特...
  • u012135300
  • u012135300
  • 2016年05月04日 22:30
  • 764

[面试] C/C++ 语法(六)—— RTTI(运行时类型信息)

RTTI(RunTime Type Information),顾名思义,对象运行时类型信息,以便在运行时进行类型识别。C++ 的对象识别可通过以下三个技术得以实现: (1)dynamic_cast 运...
  • lanchunhui
  • lanchunhui
  • 2016年03月27日 12:19
  • 516

了解运行时类型信息(RTTI)

翻阅近期的帖子,发现类似如下的问题被提及多次:如何根据名称找到控件如何根据名称找到对应的属性如何根据名称执行某个方法或事件那我们能不能做到呢,当然可以,那就让我们了解一下RTTI吧.运行时类型信(以下...
  • bdmh
  • bdmh
  • 2009年04月27日 13:29
  • 1779

运行时类型信息RTTI

我们在写C++代码的时候经常碰到使用dynamic_cast进行类型转换的情况,也都知道经过dynamic_cast的转换更加安全,因为dynamic_cast进行了类型检查。 但是可能很多人不知道d...
  • techx
  • techx
  • 2015年03月19日 18:45
  • 675

java编程思想读书笔记 第十四章 类型信息(上)

运行时类型信息可以使得在程序运行时发现和使用类型信息。Java在运行时识别对象和类信息的两种方式:一是RTTI,假定我们在编译时就知道了所有类型;二是“反射”机制,允许在运行时发现和使用类信息。 1...
  • abc709272013
  • abc709272013
  • 2016年10月17日 21:44
  • 226

MFC运行时类型信息(RTCI)

使用RTCI,需要满足两个条件:1、从CObject派生类。 2、在类声明中添加DECLARE_DYNAMIC宏,在实现文件中添加IMPLEMENT_DYNAMIC宏。// 代码使用静态库MFC. ...
  • hyhnoproblem
  • hyhnoproblem
  • 2011年01月21日 16:12
  • 7838

Java Base —— 运行时类型信息

RTTI: 在运行时,识别一个对象的类型JVM在加载*.class文件的时候会产生一个Class对象,JVM会检查该Class对象是否有语法错误并以其作为模板创建新的对象 通过Class对象可以管理...
  • zonlogic
  • zonlogic
  • 2015年12月08日 10:35
  • 99

4.MFCRTTI,运行时类型信息

RTTI MFC DECLARE_DYNAMIC IMPLEMENT_DYNAMICLASS WINDOWS
  • lingdi2000
  • lingdi2000
  • 2015年06月10日 14:39
  • 532
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在.NET运行时了解类型信息(1)
举报原因:
原因补充:

(最多只允许输入30个字)