Как получить имя переменной с помощью отражения?

Например,

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

Результатом этой программы должно быть:

 someVar 

Как я могу достичь этого, используя reflection?

Это невозможно сделать с помощью отражения, потому что переменные не будут иметь имя, однажды скомпилированное в IL. Однако вы можете использовать деревья выражений и продвигать переменную к закрытию:

 static string GetVariableName(Expression> expr) { var body = (MemberExpression)expr.Body; return body.Member.Name; } 

Вы можете использовать этот метод следующим образом:

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

Обратите внимание, что это довольно медленно, поэтому не используйте его в критически важных для вашего приложения целях. Каждый раз, когда этот код запускается, создается несколько объектов (что вызывает давление в ГК), и под крышкой вызывается много ненастраиваемых методов и используется некоторое тяжелое reflection.

Более полный пример см. Здесь .

ОБНОВИТЬ

С C # 6.0 nameof слово nameof добавляется на язык, что позволяет нам сделать следующее:

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

Это, очевидно, намного удобнее и имеет ту же стоимость, что и определение строки как константного строкового литерала.

Вы не можете, используя reflection. GetVariableName передается число 3, а не переменная. Вы можете сделать это с помощью проверки кода IL, но это, вероятно, в слишком жесткой корзине.

  • Получить экземпляр объекта-компаньона с новым API-интерфейсом Scala reflection
  • Как получить список свойств с заданным атрибутом?
  • Могу ли я использовать reflection для проверки кода в методе?
  • Создание экземпляра с использованием имени classа и вызывающего конструктора
  • Как ограничить setAccessible только «законным» использованием?
  • Динамически найти class, представляющий примитивный тип Java
  • Есть что-то вроде instanceOf (class C) в Java?
  • Вызов статического метода с reflectionм
  • Получить общий метод без использования GetMethods
  • Как получить доступ к частным методам и частным данным через reflection?
  • Создание classа из строки и создание экземпляра в Scala 2.10
  • Давайте будем гением компьютера.