Мне интересно получить имена локальных переменных (и параметров) во время выполнения в режиме рефакторинга. У меня есть следующий метод расширения:
public static string GetVariableName<T>(Expression<Func<T>> 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"
}
Однако это работает только потому, что компилятор С# продвигает любые локальные переменные (и параметры), которые фиксируются в анонимных функциях для переменных экземпляра с тем же именем в классе, генерируемом компилятором, за кулисами (за Джон Скит). Если это не так, то приведение Body
к MemberExpression
завершится с ошибкой, так как MemberExpression
представляет доступ к полям или свойствам.
Является ли эта переменная продвигаемым документированным поведением, или это детали реализации могут быть изменены в других версиях структуры?
Примечание. Этот вопрос является обобщением моего прежнего при проверке аргументов.