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

时间:2014-09-25 19:32:22

标签: delphi rtti

我可以使用RTTI和Addr(字段)获得Field的相同指针吗?

例如:

TSomeClass

私人 FSomeField:整数;

...

1)MyPointer = Addr(FSomeField)>> $ 12345

2)来自SameField的RTTI指针>> $ 12345

1 个答案:

答案 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.