我发现我认为 Delphi 中扩展 RTTI 功能的一部分是一个奇怪的疏忽(可能是故意的)。
我想转储包含大约 1500 个不同字段的记录类型中的所有字段。是的,认真的。
其中一些是 real48 类型,一些是短字符串,对于这两个,在运行时这些类型的 FieldType 似乎是 nil :
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;
如果我愿意假设所有 nil-fieldtype 字段实际上都是 real48,我可以简单地使用偏移量并(如果字段宽度为 6)获取 real48 值。
然而,第二个复杂因素是所有短字符串(即string[30]
)类型都受到类似的影响。
有没有人让这两种古帕斯卡类型与现代扩展 RTTI 一起工作?现在我正在使用一种最好的猜测方法,如果失败了,我会按字段名称对规则进行硬编码,但是如果有一些技术我可以使用它可以让我到达那里,而无需编写大量代码来提取我正在现代化的所有这些旧的帕斯卡记录文件中的信息,我希望有一个更好的主意。