Delphi-使用RTTI e Addr获取相同的字段指针



我可以用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.

最新更新