如何使用反射获取变量名称?

时间:2010-04-02 10:14:13

标签: c# reflection

例如,

static void Main()
{
    var someVar = 3;

    Console.Write(GetVariableName(someVar));
}

该程序的输出应为:

someVar

如何使用反射实现这一目标?

2 个答案:

答案 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的代码检查来做到这一点,但这可能是在太难的篮子里。