【问题标题】:Delphi: different PTypeInfo for same typeDelphi:相同类型的不同PTypeInfo
【发布时间】:2016-06-08 12:12:50
【问题描述】:

我对 Delphi 中的 PTypeInfo(以及一般的 TypeInfo)有点困惑 - 准确地说是 Delphi 10 Seattle。

我遇到了以下问题:

我们有一个 ORM 框架(基于 Spring4D)。现在我想扩展它的映射能力:Nullable integer column to a Nullable field in model.该列包含 NULL、0 或 1。 映射函数很简单:

  • NULL->null(可以为空)
  • 0->假
  • 1-> 是的

但我相信我正在研究 ORM 并不重要。问题的核心是使用 TValue 传递值,并且在通过 RTTI 将最终值分配给对象的字段之前进行了一些强制转换操作。在那里我可以看到我能够轻松重现的问题:

映射引擎为字段提供 PTypeInfo 指针。示例:

class declaration
...
MyBooleanField : Nullable<Boolean>;

在代码中的某处:

LMyBooleanField.GetTypeInfo ... result is PTypeInfo to Nullable<System.Boolean>.

如果我现在写:

LMyBooleanField.GetTypeInfo = TypeInfo(Nullable<Boolean>)

结果为假。我的终极问题是为什么?我确信类型是平等的。他们都返回 'Nullable&lt;System.Boolean&gt;' 作为它的名字。

【问题讨论】:

  • 你能提供一个minimal reproducible example
  • 具有该属性的类型是否存在于与进行比较的代码相同的二进制/项目中?例如,如果您的数据类位于 MyData.dpk 中,而 LMyBooleanField.GetTypeInfo = TypeInfo(Nullable&lt;Boolean&gt;) 代码位于 MyORM.dpk 中,那么这可能是问题所在。这就是为什么我们在Spring.pas 中有IsNullableGetUnderlyingType 这样的函数。

标签: delphi rtti spring4d tvalue


【解决方案1】:

我认为你有点回答你自己的问题。尽管 TypeInfo 和 PTypeInfo 都是指针,但它们并不是一回事。 PTypeInfo 是指向包含 TypeInfo 类型指针的位置的指针。所以 LMyBooleanField.GetTypeInfo 返回一个指向 Nullable 的字段的指针,而不是指向 Nullable 本身的指针。

【讨论】:

  • 啊,幻影投票者又来了。一定要对你不同意的东西投反对票,但至少留下评论为什么。如果您认为我错了,请说出来,并说出原因。只是投反对票对任何人都没有帮助。
  • 我会启发你,因为“幻影”不能花2分钟来教人。TypeInfo是一个返回指向TTypeInfo的指针的函数。PTypeInfo是指向TTypeInfo的指针。有一个 PPTypeInfo 可能会让你失望。
猜你喜欢
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2021-12-18
  • 2010-11-21
相关资源
最近更新 更多