我感兴趣的是在运行时以重构安全的方式检索局部变量(和参数)的名称。我有以下扩展方法:
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
表示字段或属性访问。
这个变量提升是否记录了行为,或者它是可能在框架的其他版本中发生更改的实现细节?
注意:这个问题是对my former one on argument validation的概括。
发布于 2012-06-16 21:15:01
AFAIK,这是一个实现细节。
然而,我认为你可以打赌它实际上不会改变。
我刚刚在VS2012 RC中进行了测试,它和预期的一样工作--所以你至少在几年内是安全的。
https://stackoverflow.com/questions/11063502
复制相似问题