自由Pascal上的虚方法表
我要做的是在没有实例的类中获取字段列表。。。例如:自由Pascal上的虚方法表,pascal,vmt,Pascal,Vmt,我要做的是在没有实例的类中获取字段列表。。。例如: 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^.f
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]
这样我就不会得到字段列表
欢迎任何帮助,
提前感谢Afaik经典delphi和FPC中的字段表仅适用于已发布的字段。已发布的字段必须是类字段(值类型(如integer)必须通过属性)。较新的Delphi也允许对未发布的字段使用RTTI,但其工作方式不同(不同的UNTI),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;
{$modedelphi}
使用typinfo,类;
类型
t类=类(t持久)
a:tstringlist;
b:tlist;
结束;
变量
ovmt:PVmt;
FieldTable:PVMTFieldTable;
PVMTFieldEntry;
i:长型;
开始
ovmt:=PVmt(塔类);
而ovmt nil做什么
开始
FieldTable:=PVMTFieldTable(ovmt^.vFieldTable);
如果字段表为nil,则
开始
FieldInfo:=@FieldTable^.Fields[0];
对于i:=0到FieldTable^.Count-1 do
开始
writeln(fieldinfo^.name);
FieldInfo:=PvmtFieldEntry(PByte(@FieldInfo^.Name)+1+长度(FieldInfo^.Name));
结束;
结束;
{请使用父类类型重试}
ovmt:=ovmt^.vParent;
结束;
结束