代码之家  ›  专栏  ›  技术社区  ›  Stefan Zvonar

getExecutingAssembly和getTypes正在检索后缀为“+<>C”的额外类型,该后缀显然不存在

c#
  •  2
  • Stefan Zvonar  · 技术社区  · 6 年前

    当使用getTypes执行getExecutingAssembly时,它将检索一个带有奇怪“+<gt;C”后缀的额外类型。我想这可能是某个特别的角色或什么?如下图所示。预期的结果应该是列表中的3个项目,但它正在检索一个额外的第4个项目,这是其中一个项目的副本,但结尾是“+<gt;c”?

    enter image description here

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

    if (@class.ToString().Contains("<")) // Ignore funny types returned by reflection
                    continue;
    

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

    public class WebJobLogsForErrorsCheck : MonitoringJob
    {
    
        public WebJobLogsForErrorsCheck(IKernel kernel) : base(kernel)
        {
        }
     }
    
    1 回复  |  直到 6 年前
        1
  •  5
  •   Damien_The_Unbeliever    6 年前

    编译器有时必须构造新的类型,并使用“不可宣布”的名称-没有 程序员 可以在一个有效的c程序中编写自己 -以确保它创建的名称不会冲突。

    它将创建这样的类型来支持迭代器方法或异步方法,这两种方法实际上都必须作为状态机在后台实现。


    对于这个特殊的案例,我相信 <>c 类在用于缓存未捕获的lambda时往往被构造为优化。


    它可以这样做,因为有效的clr标识符集是有效c标识符集的超集。