Afaik 经典 delphi 和 FPC 中的字段表仅适用于已发布的字段。发布的字段必须是类字段(整数等值类型必须通过属性)。较新的 Delphi 也允许 RTTI 用于未发布的字段,但工作方式不同(不同的 untis),FPC 还不支持。
我拼凑了一个小型演示示例,因为 typinfo 的帮助似乎对示例很轻。注意 tpersistent 推导。
{$mode delphi}
uses typinfo,classes;
type
TAClass=class(Tpersistent)
a: tstringlist;
b: tlist;
end;
var
ovmt: PVmt;
FieldTable: PVMTFieldTable;
PVMTFieldEntry;
i: longint;
begin
ovmt := PVmt(TAClass);
while ovmt <> nil do
begin
FieldTable := PVMTFieldTable(ovmt^.vFieldTable);
if FieldTable <> nil then
begin
FieldInfo := @FieldTable^.Fields[0];
for i := 0 to FieldTable^.Count - 1 do
begin
writeln(fieldinfo^.name);
FieldInfo := PvmtFieldEntry(PByte(@FieldInfo^.Name) + 1 + Length(FieldInfo^.Name));
end;
end;
{ Try again with the parent class type }
ovmt:=ovmt^.vParent;
end;
结尾。