2016-11-02 4 views
6

Ich versuche, Variablennamen mit RTTI wie folgt zu bekommen.Get Variablenname mit RTTI

Hier ist mein Test.

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; 

Der Name von TRTtiType zurückgeben ist leer.

Gibt es eine Möglichkeit, Variablennamen zu bekommen?

Antwort

6

RTTI gibt Informationen über Typen und nicht über Variablen. Im Allgemeinen gibt es keine Möglichkeit RTTI zu verwenden, um anhand der Adresse einer Variablen ihren Namen zu finden.

Nicht nur RTTI hilft nicht, aber was Sie versuchen, als eine Methode eines String-Objekts, ist eigentlich nicht möglich. Stellen Sie sich ein Szenario vor, in dem Sie zwei Variablen haben, die sich auf dasselbe Objekt beziehen.

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

Wie lautet der Name des einzelnen String-Objekts hier? Ist es S oder ist es T?

+0

Vielen Dank für die Erklärung. Es wäre schön gewesen, wenn RTVI (Run Time Variable Information) gehabt hätte. :) –

+2

Nichts "Laufzeit" benötigt hier. Der Compiler würde nur einen intrinsischen Code benötigen, der ein Symbol zur Kompilierzeit in einen String verwandelt. Genau wie der Name der Funktion in C# 6. - Stimme dafür: https://quality.embarcadero.com/browse/RSP-13290 –

+0

Ich habe die Stimme verwendet. Danke @StefanGlienke –