使用RTTI获取变量名称

8
我试图使用RTTI获取变量名称,就像这样。
这是我的测试。
type
  TStringHelper = record helper for string
    function Name: string;
  end;

  TMyRecord = record
    Field1:string;
  end;

implementation

{ TStringHelper }
function TStringHelper.Name: string;
var
 context : TRttiContext;
begin
 context := TRttiContext.Create;
 result := context.GetType(@Self).Name; // return empty
 context.Free;
end;

procedure TForm2.FormCreate(Sender: TObject);
var
 r : TMyRecord;
begin
  ShowMessage(r.Field1.Name);
end;

TRttiType返回的名称为空。

有没有办法获取变量名?

1个回答

9

RTTI提供关于类型而非变量的信息。一般来说,使用RTTI无法根据变量的地址找到其名称。

不仅RTTI无法帮助,而且你正在尝试的作为字符串对象方法是不可能实现的。想象一个情境,你有两个引用同一对象的变量。

S := 'foo';
T := S;

这里单个字符串对象的名称是什么?是S还是T?

非常感谢您的解释。 如果RTVI(运行时变量信息)也有就太好了。 :) - İsmail Kocacan
5
这里不需要任何 "运行时" 的东西。编译器只需要一个内置函数,在编译时将符号转换为字符串,就像 C# 6 中的 nameof 函数一样。请支持它:https://quality.embarcadero.com/browse/RSP-13290。 - Stefan Glienke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接