【发布时间】: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<System.Boolean>' 作为它的名字。
【问题讨论】:
-
你能提供一个minimal reproducible example吗
-
具有该属性的类型是否存在于与进行比较的代码相同的二进制/项目中?例如,如果您的数据类位于 MyData.dpk 中,而
LMyBooleanField.GetTypeInfo = TypeInfo(Nullable<Boolean>)代码位于 MyORM.dpk 中,那么这可能是问题所在。这就是为什么我们在Spring.pas中有IsNullable和GetUnderlyingType这样的函数。
标签: delphi rtti spring4d tvalue