我可以用RTTI和Addr(Field)获得字段的相同指针吗?
例如:
TSomeClass
私人的FSomeField:整数;
1) MyPointer=加法器(FSomeField)>>$1234
2) SameField的RTTI指针>>$1345
实际上,您只需要获得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.