2016-11-02 20 views
6

Bunun gibi RTTI kullanarak değişken ad almaya çalışıyorum.RTTI Kullanarak Değişken Adı Al

İşte benim testim. TRttiType döndürme

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; 

İsim boş.

Değişken adı almak için herhangi bir yol var mı?

cevap

6

RTTI, değişkenler hakkında değil, türler hakkında bilgi verir. Genelde, bir değişkenin adresi verildiğinde, adını bulmak için RTTI'yi kullanmanın bir yolu yoktur.

Sadece RTTI yardımcı olmuyor, aynı zamanda bir dize nesnesinin yöntemi olarak denediğiniz şey aslında mümkün değil. Aynı nesneyle ilgili iki değişkeniniz olduğu bir senaryo düşünün.

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

burada tek dize nesnenin adı nedir. S mi yoksa T mi?

+0

Açıkladığınız için çok teşekkür ederim. RTVI (Çalışma Zamanı Değişken Bilgileri) sahip olsaydı güzel olurdu. :) –

+2

Burada "çalışma zamanı" diye bir şey gerekli değil. Derleyicinin, derleme zamanında bir sembolü bir dizgiye dönüştüren bir içsel olması gerekir. Aynen C# 6 işlevinde olduğu gibi - bunun için oy verin: https://quality.embarcadero.com/browse/RSP-13290 –

+0

Oy kullanmıştım. Teşekkürler @StefanGlienke –