我有以下代码:
class Program
{
static void Main(string[] args)
{
Action whatToDo = () => {
var member = (MemberInfo)(MethodBase.GetCurrentMethod());
Thread.Sleep(0); //whatever, need something to put a breakpoint on
};
whatToDo();
}
}
当我运行它并使用手表查看绑定到
member
引用的对象的内部时,我看到MemberInfo.Name
属性的值为<Main>b__0
。这看起来很奇怪。为什么反射不使用
whatToDo
名称?如果在一个成员函数中有多个具有相同签名的动作,该怎么办-我怎么知道报告了哪个?为什么这样怪异的名字是通过反射返回的?
最佳答案
将转换为委托的Lambda表达式转换为方法。您的代码等效于:
class Program
{
static void Main(string[] args)
{
Action whatToDo = MyLambda; // Method group conversion
whatToDo();
}
static void MyLambda()
{
var member = (MemberInfo)(MethodBase.GetCurrentMethod());
Thread.Sleep(0); //whatever, need something to put a breakpoint on
}
}
...除了编译器足够聪明,可以在捕获的变量等所需的地方创建新类。在我的转换中,额外的方法称为
MyLambda
,C#编译器会生成难以理解的名称,这些名称不是有效的C#标识符(以避免冲突,阻止您直接访问它们等)。