Подтвердить что ты не робот

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

Например,

static void Main()
{
    var someVar = 3;

    Console.Write(GetVariableName(someVar));
}

Выход этой программы должен быть:

someVar

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

4b9b3361

Ответ 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));
}

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

Ответ 2

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