如何使用反射获取变量名称?
这个问题在这里已经有了答案:
这是不可能的反射,因为一旦编译为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压力),并且在封面下会调用许多不可插入的方法,并使用一些沉重的反射。
有关更完整的示例,请参阅此处。
UPDATE
在C#6.0中,关键字nameof
被添加到语言中,这使我们可以执行以下操作:
static void Main()
{
var someVar = 3;
Console.Write(nameof(someVar));
}
这显然更方便,并且将字符串定义为常量字符串文字的成本相同。
你不能,使用反射。 GetVariableName
传递数字3,而不是变量。 你可以通过代码检查IL来做到这一点,但这可能是太困难了。