代码之家  ›  专栏  ›  技术社区  ›  Eran Betzalel

如何使用反射获取变量名?[复制品]

  •  38
  • Eran Betzalel  · 技术社区  · 14 年前

    这个问题已经有了答案:

    例如,

    static void Main()
    {
        var someVar = 3;
    
        Console.Write(GetVariableName(someVar));
    }
    

    该程序的输出应为:

    someVar
    

    我怎样才能通过反射来实现这一点呢?

    2 回复  |  直到 9 年前
        1
  •  63
  •   Steven    9 年前

    使用反射不可能做到这一点,因为一旦编译到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));
    }
    

    这显然要方便得多,并且将字符串定义为常量字符串文字的成本相同。

        2
  •  -1
  •   Marcelo Cantos    12 年前

    你不能,用反射。 GetVariableName 传递的是数字3,而不是变量。您可以通过对IL的代码检查来做到这一点,但这可能是在过于困难的情况下。