例如,
static void Main() { var someVar = 3; Console.Write(GetVariableName(someVar)); }
该程序的输出应为:
someVar
如何使用反射来实现?
用反射不可能做到这一点,因为一旦编译为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关键字添加到该语言中,这使我们可以执行以下操作:
nameof
static void Main() { var someVar = 3; Console.Write(nameof(someVar)); }
显然,这要方便得多,并且以相同的代价将字符串定义为常量字符串文字即可。