static void Main()
{
var someVar = 3;
Console.Write(GetVariableName(someVar));
}
Выход этой программы должен быть:
someVar
Как я могу достичь этого с помощью отражения?
Ответ 1
Это невозможно сделать с помощью отражения, потому что переменные не будут иметь имя, однажды скомпилированное в IL. Однако вы можете использовать деревья выражений и продвигать переменную к закрытию:
static string GetVariableName<T>(Expression<Func<T>> expr)
{
var body = (MemberExpression)expr.Body;
return body.Member.Name;
}
Вы можете использовать этот метод следующим образом:
Обратите внимание, что это довольно медленно, поэтому не используйте его в критически важных для вашего приложения целях. Каждый раз, когда этот код работает, создается несколько объектов (что вызывает давление в ГК), и под крышкой вызывается много ненастраиваемых методов и используется некоторое тяжелое отражение.
С С# 6.0 к языку добавляется ключевое слово nameof, которое позволяет нам сделать следующее:
static void Main()
{
var someVar = 3;
Console.Write(nameof(someVar));
}
Это, очевидно, гораздо удобнее и имеет ту же стоимость, что и определение строки как константного строкового литерала.
Ответ 2
Вы не можете, используя отражение. GetVariableName передается число 3, а не переменная. Вы можете сделать это с помощью проверки кода IL, но, вероятно, в слишком жесткой корзине.