什么是.NET中的这种类型(反射)

34 .net c# reflection

.NET中的这种类型是什么?我正在使用反射来获取所有类的列表,这一个出现了.

它是什么?它从何而来?DisplayClass1的名称是如何选择的?我搜索来源并没有看到任何东西.什么<>意思?什么c__意思?有参考吗?

在此输入图像描述

Jon*_*eet 49

由于lambda表达式或匿名方法,几乎​​可以肯定它是由编译器生成的类.例如,考虑以下代码:

using System;

class Test
{
    static void Main()
    {
        int x = 10;
        Func<int, int> foo = y => y + x;
        Console.WriteLine(foo(x));
    }
}
Run Code Online (Sandbox Code Playgroud)

这被编译成:

using System;

class Test
{
    static void Main()
    {
        ExtraClass extra = new ExtraClass();
        extra.x = 10;

        Func<int, int> foo = extra.DelegateMethod;
        Console.WriteLine(foo(x));
    }

    private class ExtraClass
    {
        public int x;

        public int DelegateMethod(int y)
        {
            return y + x;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...除了使用<>c_displayClass1名称而不是ExtraClass.这是一个无法形容的名称,因为它无效C# - 这意味着C#编译器肯定知道它不会出现在您自己的代码中并与其选择发生冲突.

编译匿名函数的确切方式当然是特定于实现的 - 因为选择额外类的名称也是如此.

编译器还为迭代器块和(在C#5中)异步方法和委托生成额外的类.


Eri*_*ert 23

乔恩当然是对的.我提供了一个"解码器环",用于确定各种编译器生成类型名称的含义:

哪里可以了解VS调试器'魔术名'

名字很长,我们有时会抱怨我们正在扩大元数据的大小.我们可能会在将来的任何时候更改名称生成规则以解决此问题.因此,编写利用此编译器实现细节知识的代码非常重要.