0

我想要做的是在没有实例的情况下获取类中的字段列表......例如:

TAClass=class

a_: Integer;
b_: Integer;

constructor (a,b Integer);

end;

我无法从 VMT 获取 fieldTable:

ovmt: PVmt;
ftable: PVmtFieldTable;
finfo: PVmtFieldEntry;

ovmt:=PVmt(TAClass);
ftable := ovmt^.vfieldtable
finfo := ftable^.fields[0]

这样我就不会得到字段列表

欢迎任何帮助,在此先感谢

4

1 回答 1

0

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;

结尾。

于 2014-10-26T11:05:59.217 回答