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

时间:2011-06-19 13:00:15

标签: c# .net reflection

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

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

enter image description here

2 个答案:

答案 0 :(得分:49)

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

using System;

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

编译成:

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;
        }
    }
}

...除了使用<>c_displayClass1作为名称而不是ExtraClass。这是一个难以理解的名称,因为它无效C# - 这意味着C#编译器确信它不会出现在您自己的代码中并与其选择发生冲突。

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

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

答案 1 :(得分:23)

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

Where to learn about VS debugger 'magic names'

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