我发现我认为德尔福扩展RTTI功能的一个奇怪的疏忽(可能是故意的)。
我想将所有字段转储到包含大约1500个不同字段的记录类型中。是的,认真的。
其中一些是real48类型,有些是shorttring,对于这两个,在运行时看起来这些类型的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]
)类型同样受到影响。
有没有人将这两种古代Pascal类型与现代扩展RTTI一起使用? 现在我正在使用一种最好的猜测方法,如果失败了,我就按字段的名称对规则进行硬编码,但是如果有一些技术可以使用,那将会让我在那里不需要编写大量的代码来提取来自我现代化的所有这些旧的pascal记录文件的信息,我将不胜感激。
答案 0 :(得分:4)
不幸的是,Real48没有任何类型信息。
当您尝试编译时,您可以看到:
program Project1;
begin
TypeInfo(Real48);
end.
string [n]语法也是如此。但是你可以通过定义自己的字符串类型来修复它:
type
string30 = string[30];
仅此一项不会包含记录字段的rtti,因此您需要修改/修复我在此处显示的rtti:https://stackoverflow.com/a/12687747/587106