我希望以一种能够保持重构安全的方式,在运行时获取本地变量(和参数)的名称。我有以下扩展方法:
public static string GetVariableName<T>(Expression<Func<T>> variableAccessExpression)
{
var memberExpression = variableAccessExpression.Body as MemberExpression;
return memberExpression.Member.Name;
}
该 lambda 表达式捕获的变量名称将通过此语法返回:
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
表示字段或属性访问。
该变量提升是否为文档化行为,还是受其他版本框架更改的实现细节?
注意:此问题是对我以前关于参数验证的问题的概括。