GetExecutingAssembly和GetTypes正在检索带有"+ <> c"后缀的额外类型,这显然不存在

Ste*_*nar 2 c#

当使用GetTypes执行GetExecutingAssembly时,它正在检索带有奇怪的"+ <> c"后缀的额外类型.我假设这可能是一些特殊的角色或什么?如下图所示.预期结果应该只是列表中的3个项目,但它是检索一个额外的第4个项目,它是其中一个项目的副本,但最后是"+ <> c"?

在此输入图像描述

在处理返回的类型之前,我必须做一些黑客检查,如下所示:

if (@class.ToString().Contains("<")) // Ignore funny types returned by reflection
                continue;
Run Code Online (Sandbox Code Playgroud)

如果感兴趣的话,这些类的一般结构是相同的,如下所示:

public class WebJobLogsForErrorsCheck : MonitoringJob
{

    public WebJobLogsForErrorsCheck(IKernel kernel) : base(kernel)
    {
    }
 }
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

编译器有时必须构造新类型,并使用"不可启动"的名称 - 没有程序员可以在有效的C#程序1中编写自己的名称 - 以确保它创建的名称不会发生冲突.

它将创建这样的类型以支持例如迭代器方法或异步方法,这两者实际上必须在后台实现为状态机.


对于这个特定的情况,我认为<>c类通常是在用于缓存非捕获lambdas时构造的,作为优化.


1它可以这样做,因为有效CLR标识符集是有效C#标识符集的超集.