Ответ 1
Это невозможно сделать с помощью отражения, потому что переменные не будут иметь имя, однажды скомпилированное в 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));
}
Обратите внимание, что это довольно медленно, поэтому не используйте его в критически важных для вашего приложения целях. Каждый раз, когда этот код работает, создается несколько объектов (что вызывает давление в ГК), и под крышкой вызывается много ненастраиваемых методов и используется некоторое тяжелое отражение.
Для более полного примера см. здесь.
UPDATE
С С# 6.0 к языку добавляется ключевое слово nameof
, которое позволяет нам сделать следующее:
static void Main()
{
var someVar = 3;
Console.Write(nameof(someVar));
}
Это, очевидно, гораздо удобнее и имеет ту же стоимость, что и определение строки как константного строкового литерала.