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

Era*_*lel 38 c# reflection

例如,

static void Main()
{
    var someVar = 3;

    Console.Write(GetVariableName(someVar));
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出应为:

someVar
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ven 65

使用反射无法做到这一点,因为变量在编译为IL后将没有名称.但是,您可以使用表达式树并将变量提升为闭包:

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

    return body.Member.Name;
}
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式使用此方法:

static void Main()
{
    var someVar = 3;

    Console.Write(GetVariableName(() => someVar));
}
Run Code Online (Sandbox Code Playgroud)

请注意,这非常慢,因此请勿在应用程序的性能关键路径中使用它.每次运行此代码时,都会创建几个对象(这会导致GC压力),并且在封面下会调用许多非可嵌入的方法并使用一些重反射.

有关更完整的示例,请参见此处.

UPDATE

使用C#6.0,nameof关键字将添加到语言中,这使我们可以执行以下操作:

static void Main()
{
    var someVar = 3;

    Console.Write(nameof(someVar));
}
Run Code Online (Sandbox Code Playgroud)

这显然更方便,并且具有相同的成本将字符串定义为常量字符串文字.

  • +'更贵":) (4认同)
  • 我明白你的意思了.您正在讨论通过调用`.Compile()`方法在运行时编译表达式树.我同意这更加昂贵. (2认同)