当使用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)
编译器有时必须构造新类型,并使用"不可启动"的名称 - 没有程序员可以在有效的C#程序1中编写自己的名称 - 以确保它创建的名称不会发生冲突.
它将创建这样的类型以支持例如迭代器方法或异步方法,这两者实际上必须在后台实现为状态机.
对于这个特定的情况,我认为<>c类通常是在用于缓存非捕获lambdas时构造的,作为优化.
1它可以这样做,因为有效CLR标识符集是有效C#标识符集的超集.