,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 ?
,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 ?
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.
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. –
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
Evet, haklısınız. Performans maliyeti var. Ama ifade ağaçları derlemek için "nispeten" küçük karşılaştırır. –
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.
@helen sorum, oldukça farklı olduğunu düşündüğüm bir sorunun dağılmasından ziyade oldukça basit. –
Bunun arkasındaki mantık ne olabilirdi? – Dested