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

标签 delphi rtti

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

例如:

TSomeClass

私有(private)的
FSomeField:整数;

...

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

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

最佳答案

实际上,您只需要获取 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.

关于Delphi - 使用 RTTI e Addr 获取相同的字段指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046617/

相关文章:

delphi - 资源字符串最大大小和最大数量限制是多少?

delphi - 如何通过 RTTI 设置/获取 TStringGrid.Cells 等复杂事物的属性值?

Delphi - 从每秒更改的日志文件中读取

delphi - 新的 Delphi Rad Studio XE2 中的 FireMonkey (FMX) 包含哪些功能的详细信息?

Delphi 2010 : New RTTI, 将属性值设置为任意值

delphi - 是否有任何 Delphi 版本可以发出包含 tkUnknown 的 RTTI?

c++ - 在 GUI 设计中避免 dynamic_cast

delphi - 如何循环类中的所有属性

delphi - 如何在 Delphi 中将组件作为过程的参数传递?

delphi - 如何从派生类访问隐藏成员?