Меня интересует получение имен локальных переменных (и параметров) во время выполнения безопасным для рефакторинга способом. У меня есть следующий метод расширения:
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
представляет доступ к полю или свойству.
Является ли эта переменная продвижение задокументированным поведением или это деталь реализации, которая может быть изменена в других версиях платформы?
Примечание: этот вопрос является обобщением моего предыдущего утверждения о проверке аргументов. п.