Получение имен локальных переменных (и параметров) во время выполнения с помощью лямбда-выражений

Меня интересует получение имен локальных переменных (и параметров) во время выполнения безопасным для рефакторинга способом. У меня есть следующий метод расширения:

public static string GetVariableName(Expression> variableAccessExpression)
{
    var memberExpression = variableAccessExpression.Body as MemberExpression;
    return memberExpression.Member.Name;
}

…который возвращает имя переменной, захваченной через лямбда-выражение:

static void Main(string[] args)
{
    Console.WriteLine(GetVariableName(() => args));
    // Output: "args"

    int num = 0;
    Console.WriteLine(GetVariableName(() => num));
    // Output: "num"
}

Однако это работает только потому, что компилятор C# продвигает любые локальные переменные (и параметры), захваченные в анонимных функциях, к переменным экземпляра того же имени в классе, сгенерированном компилятором за кулисами (согласно Jon Skeet. Если это не так, приведениеBodyкMemberExpressionзавершится ошибкой, поскольку MemberExpressionпредставляет доступ к полю или свойству.

Является ли эта переменная продвижение задокументированным поведением или это деталь реализации, которая может быть изменена в других версиях платформы?

Примечание: этот вопрос является обобщением моего предыдущего утверждения о проверке аргументов. п.

19
задан Community 23 May 2017 в 11:45
поделиться