一尘不染

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

c#

例如,

static void Main()
{
    var someVar = 3;

    Console.Write(GetVariableName(someVar));
}

该程序的输出应为:

someVar

如何使用反射来实现?


阅读 276

收藏
2020-05-19

共1个答案

一尘不染

用反射不可能做到这一点,因为一旦编译为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压力),并且在幕后将调用许多非固定方法,并使用一些重反射。

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

更新

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

static void Main()
{
    var someVar = 3;

    Console.Write(nameof(someVar));
}

显然,这要方便得多,并且以相同的代价将字符串定义为常量字符串文字即可。

2020-05-19