为什么我应该关心Delphi中的RTTI?

我听说过很多关于Delphi 2010新的/改进的RTTIfunction ,但我必须承认我的无知……我不明白这一点。 我知道Delphi的每个版本都支持RTTI …我知道RTTI(运行时types信息)允许我在运行应用程序时访问types信息。

但究竟是什么意思呢? Delphi 2010的RTTI支持与.NET中的reflection相同吗?

有人可以解释为什么RTTI是有用的吗? 假装我是你尖尖的头发老板,并帮助我理解为什么RTTI很酷。 我如何在真实世界的应用程序中使用它?

Delphi中的RTTI与.NET或其他pipe理语言中的Reflection完全不同,因为它在编译的代码上运行,而不是中间语言(字节码)。 然而,这是一个非常相似的概念,Delphi 2010中的新RTTI系统使得它更接近于反思,暴露了一个完整的面向对象的API。

在D2010之前,RTTI非常有限。 关于我唯一记得做的事情就是将枚举types转换为string ( 反之亦然 ),以便在下拉列表中使用。 我可能曾经用它来控制持久性 。

使用D2010中的新RTTI,您可以做更多的事情:

  • XML序列化

  • 基于属性的元数据( TCustomAttribute )。 典型的用例是属性和自动权限检查的自动validation,通常需要编写大量的代码。

  • 添加活动脚本支持(即使用Windows脚本控制)

  • build立一个插件系统; 你可以做到这一点,但有很多头痛。 我无法从上到下find一个很好的例子,但所有必要的function现在都可用。

  • 看起来好像有人甚至试图为Delphi 2010实现Spring (DI框架)。

所以这绝对是非常有用的,虽然我不确定你能够向PHB解释它有多好。 它的大部分用处可能会通过第三方库和框架来实现,就像今天在.NET社区中工作的方式一样 – 在代码中看到reflection代码是很less见的,但是一个典型的应用程序会使用几个基于reflection的组件,如对象关系映射器或IoC容器。

我回答了这个问题吗?

大多数人可能不会在真实世界的应用程序中使用它。

将使用它的人是框架构build者。 DUnit等框架广泛使用RTTI。

有了新的RTTIfunction,我们应该开始看到更多先进的框架和工具出现,类似于.NET的可用框架。 这些框架将比RTTI将自己的发展革命化的发展。

D2010的扩展RTTI很像C#的reflection。 它使您能够在任何物体的领域,或检查其方法。 这有各种各样的潜在用途。 例如,如果您可以读取对象的任何字段,则可以编写可以与任何对象一起使用的序列化代码。 而且能够检查方法并获得他们的名字和签名,使得一个类更容易注册到脚本引擎。

对我来说,这是扩展RTTI的主要优势:通过检查其成员来编写可与任何类一起工作的代码的能力,而不是一遍又一遍地编写针对每个类的相同代码的不同版本。

delphi的RTTI从1.0版本开始一直很重要。 传统的RTTIfunction包括类的“发布”属性部分,它允许对象检查器和组件devise时function工作。 出于我的目的,我经常使用发布的类属性来允许在运行时枚举这些属性。 从我的对象存储到磁盘的东西,为了持久性。

Delphi 2010 RTTI大规模扩展了这个经典的RTTI,以至于你可以原谅Delphi在Delphi 2010之前甚至没有RTTI。

我会说,“新RTTI”的第一个最有用的应用程序(如同已经说明的其他几个答案)将会出现在大师写的框架中:

  1. 处理持久性文件或数据库。 数据库和configuration或文件保存/加载框架和组件将使用这个底层。

  2. 处理来自各种线上格式的酸洗/编组/编码/解码,如JSON,XML,EDI和其他东西。

  3. unit testing是由其他人(JUnit)提到的,但是我想也许相同的框架对于debugging和错误报告工具来说可能非常方便。 给定一个作为parameter passing的对象,在堆栈​​上,为什么不有bug报告,可以转储所有传递给失败函数的数据,而不仅仅是一个函数列表?

正如你所看到的,一些有创造力的人可能会想到更多的用途。 你可以这样说,虽然它不会给.NETreflection(也就是另外一个答案提供的更多的信息)带来奇偶性,但是它确实为很强的静态types提供了很多“dynamic语言”特性(比如Perl,Python,JavaScript)delphi的types系统世界。

就我个人而言,扩展RTTI给了从方法指针检索调用约定的可能性。 不过,目前这个代码是在条件指令下的,因为我对它不满意。

(有关基本RTTI的工作方式的批评和build议值得欢迎,tho)

寻找TMS Aurelius ,你会发现RTTI属性在创build一个ORM数据库框架和XML序列化到纯对象方面是非常有用的,相反也是如此。

你应该关心,因为他们把它放在盒子上。 显然他们认为有些人会关心。

无论你是否真正使用它,完全取决于你的项目的性质。 既然你以前没有这样做,不明白为什么现在这样做是有好处的,这就表明你没有用处。 那么是否花时间进一步研究这个问题,以便发现你是否能够find它的用途。

无论这是对你的项目最有效率的使用你的时间,再次是只有你可以知道的东西。