2016-11-02 9 views
6

私はこのようにRTTIを使用して変数名を取得しようとしています。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の戻り値は空です。

変数名を取得する方法はありますか?

答えて

6

RTTIは、変数ではなく型についての情報を提供します。一般に、RTTIを使用して、変数のアドレスを指定してその名前を見つける方法はありません。

RTTIだけでなく、文字列オブジェクトのメソッドとして試みていることは実際には不可能です。同じオブジェクトを参照する2つの変数があるシナリオを想像してみてください。

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

ここで単一文字列オブジェクトの名前は何ですか。それはSですか、それともTですか?

+0

ありがとうございます。 RTVI(実行時変数情報)があればうれしいでしょう。 :) –

+2

ここには「ランタイム」は必要ありません。コンパイラは、コンパイル時にシンボルを文字列に変換する組み込み関数を必要とするだけです。 C#6の関数nameofと同じです。投票してください:https://quality.embarcadero.com/browse/RSP-13290 –

+0

私は投票を使用しました。ありがとう@StefanGlienke –

関連する問題