我有兴趣在运行时以重构安全的方式检索局部变量(和参数)的名称。我有以下扩展方法:
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)。如果不是这种情况,to 的Body
转换MemberExpression
将失败,因为MemberExpression
表示字段或属性访问。
这个变量提升是否记录了行为,或者它是在其他版本的框架中可能发生变化的实现细节?
注意:这个问题是我之前关于参数验证的问题的概括。