我为什么要关心Delphi中的RTTI?

时间:2010-02-07 14:32:37

标签: delphi reflection delphi-2010 rtti

我听说过很多新的/改进的RTTI capabilities of Delphi 2010,但我必须承认我的无知......我不明白。我知道每个版本的Delphi都支持RTTI ......我知道RTTI(运行时类型信息)允许我在应用程序运行时访问类型信息。

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

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

7 个答案:

答案 0 :(得分:37)

Delphi中的RTTI仍然不像.NET中的反射或其他托管语言一样完全,因为它运行在已编译的代码上,而不是中间语言(字节码)。但是,它是一个非常相似的概念,Delphi 2010中的新RTTI系统使它更接近于反射,暴露了整个面向对象的API。

2010年前,RTTI相当有限。关于我唯一记得做过的就是转换enumerated type to a string(或vice versa)以便在下拉列表中使用。我可能曾在control persistence使用它。

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

  • XML Serialization

  • 基于Attribute的元数据(TCustomAttribute)。典型的用例是自动验证属性和自动权限检查,这两件事通常都需要为此编写大量代码。

  • 添加Active Scripting支持(即使用Windows脚本控件)

  • 构建插件系统;你以前可以做到这一点,但有很多令人头疼的问题。我无法从上到下找到一个非常好的例子,但现在可以使用所有必要的功能。

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

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

我回答了这个问题吗?

答案 1 :(得分:12)

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

将使用它的人是框架构建者。像DUnit这样的框架广泛使用RTTI。

使用新的RTTI功能,我们应该开始看到更多高级框架和工具的出现,类似于.NET可用的框架和工具。这些框架将比RTTI本身更能彻底改变您的开发。

答案 2 :(得分:11)

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

对我来说,这是扩展RTTI的主要优势:通过检查其成员来编写适用于任何类的代码的能力,而不是为每个单独的类定制编写相同代码的不同版本。

答案 3 :(得分:2)

从版本1.0开始,Delphi中的RTTI一直很重要。经典RTTI功能包括Classes的“已发布”属性部分,它允许Object Inspector和组件设计时功能工作。出于我的目的,我经常使用Published类属性来允许在运行时枚举这些属性。将事物从我的对象存储到磁盘,以保持持久性。

Delphi 2010 RTTI大量扩展了这个经典的RTTI,以至于您可以原谅Delphi在2010年delphi之前甚至没有RTTI。

我想说“The New RTTI”的#1最有用的应用程序(正如其他几个答案已经说明的那样)将出现在由大师编写的框架中:

  1. 处理文件或数据库的持久性。数据库和配置或文档保存/加载框架和组件将在幕后使用。

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

  3. 其他人(JUnit)提到了单元测试,但我认为相同的框架可能对调试和错误报告工具非常方便。给定一个作为参数传递的对象,在堆栈​​上,为什么不能将错误报告转储到传递给失败的函数的所有数据,而不仅仅是函数列表?

  4. 正如您所看到的,一些有创造力的人可能会想到更多用途。你可以说,虽然它没有为.NET反射提供平价(另一个答案更多地说明了),它确实带来了许多“动态语言”功能(想想Perl,Python,JavaScript)到其他强类型的静态德尔福的类型系统世界。

答案 4 :(得分:0)

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

(欢迎使用基本RTTI工作的批评和建议)

答案 5 :(得分:0)

查找TMS Aurelius,您将看到RTTI属性在创建ORM数据库框架和XML序列化为纯对象方面非常有用,而且相反。

答案 6 :(得分:-5)

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

您是否真正使用它完全取决于项目的性质。既然你之前没有它并且不明白为什么现在这样做是有好处的,那么这对我来说就是你没有用它。然后由您决定是否花时间进一步研究该主题,以便发现您是否能够找到的用途。

这是否是您与项目相关的最有效利用时间,也是您唯一可以知道的事情。