为什么反射的拉姆达返回这样一个奇怪的名字?(Why does reflection return s

2019-10-16 16:33发布

我有这样的代码:

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名字? 如果我有一个成员函数中相同的签名更是一个动作 - 我怎么会知道哪一个是报道?

为什么这样一个奇怪的名字被反射回来了?

Answer 1:

它们被转换为代表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#标识符(以避免冲突,防止你直接访问它们等)。



文章来源: Why does reflection return such a weird name for a lambda?