2016-11-02 8 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는 도움이되지 않을뿐만 아니라 문자열 객체의 메소드로 시도한 것은 실제로 가능하지 않습니다. 동일한 객체를 참조하는 두 개의 변수가있는 시나리오를 상상해보십시오.

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

여기에 단일 문자열 개체의 이름은 무엇입니까? 그것은 S입니까, 아니면 T입니까?

+0

설명해 주셔서 감사합니다. RTVI (런타임 변수 정보)가 있다면 좋았을 것입니다. :) –

+2

"런타임"이 필요 없습니다. 컴파일러는 컴파일 타임에 심볼을 문자열로 바꾸는 내장 함수 만 있으면됩니다. C# 6의 nameof 함수와 같습니다. - 투표하십시오 : https://quality.embarcadero.com/browse/RSP-13290 –

+0

투표를 사용했습니다. 감사합니다 @StefanGlienke –