我发现 Delphi 中的扩展 RTTI 功能有一个奇怪的疏忽(可能是故意的)。
我想转储包含大约 1500 个不同字段的记录类型中的所有字段。是的,认真的。
其中一些是 real48 类型,一些是短字符串,对于这两种类型,在运行时这些类型的 FieldType 似乎为零:
function TRttiField.GetValue(Instance: Pointer): TValue;
var
ft: TRttiType;
begin
ft := FieldType;
if ft = nil then
raise InsufficientRtti; // This fires!
TValue.Make(PByte(Instance) + Offset, ft.Handle, Result);
end;
Run Code Online (Sandbox Code Playgroud)
如果我愿意假设所有 nil-fieldtype 字段实际上都是 real48 字段,我可以简单地使用偏移量并(如果字段宽度为 6)获取 real48 值。
然而,第二个复杂之处是所有短字符串(即string[30])类型都受到类似的困扰。
有人让这两种古代 Pascal 类型与现代扩展 RTTI 一起使用吗?现在我正在使用最佳猜测方法,如果失败,我会按字段名称对规则进行硬编码,但如果有某种技术我可以使用,那么我就可以到达那里,而无需编写大量代码来提取来自我正在现代化的所有这些旧的帕斯卡记录文件中的信息,我将不胜感激更好的想法。
不幸的是 Real48 没有任何类型信息。
当你尝试编译时你会看到:
program Project1;
begin
TypeInfo(Real48);
end.
Run Code Online (Sandbox Code Playgroud)
string[n] 语法也是如此。但是您可以通过定义自己的字符串类型来修复它,例如:
type
string30 = string[30];
Run Code Online (Sandbox Code Playgroud)
仅此一项就不会包括记录字段的 rtti,因此您需要破解/修复 rtti,如下所示: https: //stackoverflow.com/a/12687747/587106
| 归档时间: |
|
| 查看次数: |
360 次 |
| 最近记录: |