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

Например,

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, но это, вероятно, в слишком жесткой корзине.

  • Получить общий метод без использования GetMethods
  • Как создать экземпляр произвольного типа массива во время выполнения?
  • Как вы можете перебирать свойства classа?
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • Какая польза для тегов в Go?
  • C ++ итерации во nested поле struct с boost fusion adapt_struct
  • Gson TypeToken с динамическим типом ArrayList
  • Каков риск безопасности отражения объекта?
  • Как получить список свойств с заданным атрибутом?
  • Получить экземпляр нового объекта из типа
  • Как проверить, является ли тип примитивным
  • Давайте будем гением компьютера.