43

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

但这究竟是什么意思Delphi 2010 的 RTTI 是否支持与.NET 中的反射相同的东西?

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

4

7 回答 7

38

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

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

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

  • XML 序列化

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

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

  • 构建插件系统;你以前可以这样做,但是有很多头痛。我无法找到一个从上到下执行此操作的非常好的示例,但现在所有必要的功能都可用。

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

所以这绝对是非常有用的,虽然我不确定你能多好地向 PHB 解释它;它的大部分用途可能将通过 3rd 方库和框架来实现,这与它在当今 .NET 社区中的工作方式非常相似——很少看到反射代码位于业务逻辑中,但典型的应用程序会使用几个基于反射的组件,例如对象关系映射器或 IoC 容器。

我回答问题了吗?

于 2010-02-07T15:31:59.913 回答
12

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

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

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

于 2010-02-07T19:31:23.617 回答
11

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

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

于 2010-02-07T15:11:44.047 回答
2

自 1.0 版以来,Delphi 中的 RTTI 一直很重要。经典 RTTI 功能包括类的“已发布”属性部分,它允许对象检查器和组件设计时功能工作。出于我的目的,我经常使用已发布的类属性来允许在运行时枚举这些属性。将我的对象中的东西存储到磁盘上,以保持持久性。

Delphi 2010 RTTI 极大地扩展了这个经典的 RTTI,以至于您认为 Delphi 甚至在 delphi 2010 之前都没有 RTTI 是可以原谅的。

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

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

  2. 处理与各种在线格式(如 JSON、XML、EDI 和其他内容)之间的酸洗/编组/编码/解码。

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

As you can see, some creative people are likely to think of even more uses for this. You could say, that though it does not bring parity to .NET reflection (which another answer speaks more about), it does bring a lot of "dynamic language" features (Think of Perl, Python, JavaScript) to an otherwise strongly typed static-type systems world of Delphi.

于 2010-02-08T18:22:12.327 回答
0

For me, personally, extended RTTI gave a possibility to retrieve calling convention from the method pointer. However, currently, that code is under conditional directive, because i am not satisfied with it.

(Critics and suggestions on workarond with basic RTTI are welcome, tho)

于 2010-11-14T19:42:17.547 回答
0

Look for TMS Aurelius and you will see that RTTI Attributes are very useful in terms of creating an ORM DataBase Framework and XML Serialization into pure objects and the opposite too.

于 2013-07-27T13:05:48.270 回答
-5

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

您是否真正使用它完全取决于您的项目的性质。由于您以前没有它并且不明白为什么现在拥有它是一个好处,这会向我暗示您没有用它。然后由您决定是否花时间进一步研究该主题以发现您是否能够找到它的用途。

这是否是您在项目中最有效地利用时间,这也是只有您才能知道的事情。

于 2010-02-07T20:02:18.750 回答