我可以使用RTTI和Addr(字段)获得Field的相同指针吗?
例如:
TSomeClass
私人 FSomeField:整数;
...
1)MyPointer = Addr(FSomeField)>> $ 12345
2)来自SameField的RTTI指针>> $ 12345
答案 0 :(得分:3)
实际上你只需要获得RTTI字段偏移量(TRttiField.Offset
)并将其添加到初始对象地址(实例地址)。
type
TTest = class(TObject)
private
FInt : integer;
FString : string;
FBool : boolean;
end;
var t : TTest;
ctx : TRttiContext;
f : TRttiField;
begin
t := TTest.Create();
try
writeln(Format('FInt: %p',[@t.FInt]));
writeln(Format('FString: %p', [addr(t.FString)]));
writeln(Format('FBool: %p', [@t.FBool]));
writeln('--------------');
//field address using rtti
ctx := TRttiContext.Create();
try
for f in ctx.GetType(t.ClassType).GetFields() do begin
writeln(Format('%s: %8x', [f.Name, NativeInt(t) + f.Offset]));
end;
finally
ctx.Free();
end;
finally
t.Free();
end;
readln;
end.