例如,
static void Main()
{
var someVar = 3;
Console.Write(GetVariableName(someVar));
}
该程序的输出应为:
someVar
如何使用反射实现这一目标?
答案 0 :(得分:64)
使用反射无法做到这一点,因为变量在编译为IL后将没有名称。但是,您可以使用表达式树并将变量提升为闭包:
static string GetVariableName<T>(Expression<Func<T>> expr)
{
var body = (MemberExpression)expr.Body;
return body.Member.Name;
}
您可以按如下方式使用此方法:
static void Main()
{
var someVar = 3;
Console.Write(GetVariableName(() => someVar));
}
请注意,这非常慢,因此请勿在应用程序的性能关键路径中使用它。每次运行此代码时,都会创建几个对象(导致GC压力),并且在封面下会调用许多非可嵌入的方法,并使用一些重反射。
有关更完整的示例,请参阅here。
<强>更新强>
使用C#6.0,nameof
关键字会添加到该语言中,这样我们就可以执行以下操作:
static void Main()
{
var someVar = 3;
Console.Write(nameof(someVar));
}
这显然更方便,并且具有相同的成本将字符串定义为常量字符串文字。
答案 1 :(得分:-1)
你不能,使用反射。 GetVariableName
传递数字3,而不是变量。你可以通过IL的代码检查来做到这一点,但这可能是在太难的篮子里。