2010-04-02 17 views
34
Örneğin

,Yansıma kullanarak değişken adı nasıl alınır?

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(someVar)); 
} 

Bu programın çıktısı olmalıdır:

someVar 

nasıl yansıma kullanarak elde edebilirsiniz ?

+1

@helen sorum, oldukça farklı olduğunu düşündüğüm bir sorunun dağılmasından ziyade oldukça basit. –

+0

Bunun arkasındaki mantık ne olabilirdi? – Dested

cevap

57

Bunu yansıtma ile yapmak mümkün değildir, çünkü değişkenler IL'ye derlendikten sonra bir adı olmayacaktır. Ancak, ifade ağaçlar kullanabilir ve kapatılmasına değişkeni destekleyebilir: aşağıdaki gibi bu yöntemi kullanabilirsiniz

static string GetVariableName<T>(Expression<Func<T>> expr) 
{ 
    var body = (MemberExpression)expr.Body; 

    return body.Member.Name; 
} 

: bu oldukça yavaştır, bu yüzden kullanmamanızı

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(() => someVar)); 
} 

Not Uygulamanızın performans kritik yollarında. Bu kod her çalıştığında, (GC basıncına neden olan) birkaç nesne oluşturulur ve kapağın altında birçok inline edilemeyen yöntem çağrılır ve bazı ağır yansıma kullanılır.

Daha ayrıntılı bir örnek için bkz. here.

GÜNCELLEME C# 6.0 ile

, nameof kelime yapmamızı sağlayan dil, aşağıdaki paragraf eklenir:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(nameof(someVar)); 
} 

Bu açıkça çok daha uygundur ve aynı maliyete sahiptir dizeyi sabit dize değişmezi olarak tanımlamaktadır.

+0

Performans açısından gerçekten kötü olduğundan emin değilim. Performans sorunlarına neden olan şey, ifade ağaçlarını derlemektir, ancak bunu burada yapmazsınız. –

+0

GetVariableName (() => someVar) 'ın Reflektör'ü kullanarak derlendiği yeri kendiniz arayın. Bu kod her çalıştığında, çeşitli nesneler oluşturulur ve kapağın altında birçok inline olmayan yöntem çağrılır ve bazı ağır yansıma kullanılır. İfade ağaçlarını kullanmak özgür değildir. – Steven

+0

Evet, haklısınız. Performans maliyeti var. Ama ifade ağaçları derlemek için "nispeten" küçük karşılaştırır. –

0

Yansıma kullanarak yapamazsınız. GetVariableName, 3 değil, bir değişken geçirilir. Bunu, IL'nin teftiş yoluyla yapabilirsin, ama muhtemelen çok sert sepetin içinde.