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

Mic*_*ick 42 delphi reflection rtti delphi-2010

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

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

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

Aar*_*ght 37

RTTI在Delphi中仍然不全功能作为.NET或其他托管语言中的体现,因为它是在编译的代码运行,而不是一种中间语言(字节码).然而,这是一个非常类似的概念和新的RTTI系统德尔福2010年带来了它很多接近反射,露出一个完整的面向对象的API.

在2010年前期,RTTI相当有限.关于我唯一记得做的事情是将枚举类型转换为字符串(反之亦然),以便在下拉列表中使用.我可能曾经一度使用它来控制持久性.

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

  • XML序列化

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

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

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

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

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

我回答了这个问题吗?

  • @Deltics:我认为,技术上*任何*都可以用于通用编程语言.如果需要,可以在GW Basic中实现XML序列化.不同之处在于程度,而且 - 恕我直言 - 这里的学位是一个非常大的学位. (7认同)
  • 我真的不知道怎么样; 在D2010("TCustomAttribute"是新的)之前,属性肯定是不可能的!事先肯定没有任何DI/IoC框架,XML序列化几乎是不可能的,因为旧的RTTI只能找到`published`属性,而Active Scripting是一个经常讨论但从未解决的问题.你如何用旧的RTTI完成任何一个?你有链接到某个人拉下它吗?如果您说的是真的,我很乐意编辑答案. (5认同)
  • 而且,不言而喻,这种事情一直是可能的,但是不可能的是创建一个*通用框架*来做这个与*任何应用程序*集成的框架.也许这就是翻译中迷失的东西; 你可以自己做所有这些事情,用于你个人控制的应用程序,并且可以轻松修改和推理; 反射(和新的RTTI)给出的是能够创建执行这些任务的可重用框架级组件,因此您不会为每个项目重新实现此功能. (4认同)
  • @Mason Wheeler:很难在评论框中充分解释DI/IoC,但我会再试一次.它不仅仅是抽象数据类型的*用法* - 它们一直存在 - 它是这些类型的*实例化*.它不是新的接口 - 我也使用了自D4以来的接口 - 它的想法是你从未真正*创建实现一个*的具体类型.容器为您完成,如果您需要进行应用程序范围的实现更改,它实际上是一行代码或配置,即使构造发生在100个不同的地方. (3认同)
  • @Aaronaught:当然属性是可能的,你只是没有编译器魔法来帮助你,并且必须提供你自己的"注册表"和查找机制.这些"手动"机制当然可以比RTTI提供的通用机制更有效.XML序列化同样完全可行.我无法提供代码链接,因为它本质上是商业性的,但我可以向您保证,您提到的所有内容都是在D2010 RTTI扩展之前完成的**. (2认同)

Lac*_*anG 12

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

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

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

  • 因此,大多数人会间接使用那些使用它的东西。但大多数人不会直接使用它。就像大多数人不会编写组件一样。但每个人都使用它们。 (2认同)

Mas*_*ler 11

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

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