2016-11-02 6 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

Здесь ничего не нужно "runtime". Компилятору просто понадобится внутренняя среда, которая превращает символ в строку во время компиляции. Также как функция nameof в C# 6. - проголосуйте за нее: https://quality.embarcadero.com/browse/RSP-13290 –

+0

Я использовал голосование. Спасибо @StefanGlienke –