我有这段代码:
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();
}
}
当我运行它并使用watch查看绑定到member
引用的对象时,我看到MemberInfo.Name
属性具有值<Main>b__0
。
这看起来很奇怪。为什么反射不会使用whatToDo
名称?如果我在一个成员函数中有更多具有相同签名的操作怎么办 - 如何判断哪一个被报告?
为什么反射会返回这么奇怪的名字?
答案 0 :(得分:9)
正在转换为委托的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#标识符(为了避免冲突,阻止您直接访问它们等)。