如何使用reflection获取variables名称?
例如,
static void Main() { var someVar = 3; Console.Write(GetVariableName(someVar)); }
这个程序的输出应该是:
someVar
我怎样才能做到这一点使用reflection?
这是不可能的reflection,因为variables不会有一个名字一旦编译到IL。 但是,您可以使用expression式树并将该variables提升为闭包:
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)); }
请注意,这非常慢,所以不要在应用程序的性能关键path中使用它。 每次这个代码运行时,会创build几个对象(这会导致GC压力),并在封面下面调用许多不可插入的方法,并使用一些沉重的reflection。
有关更完整的示例,请参阅此处 。
UPDATE
在C#6.0中, nameof
关键字被添加到语言中,这使我们能够执行以下操作:
static void Main() { var someVar = 3; Console.Write(nameof(someVar)); }
这显然更方便,并且将string定义为常量string的成本相同。
你不能用reflection。 GetVariableName
传递数字3,而不是一个variables。 你可以通过代码检查IL来做到这一点,但这可能是太困难了。