【问题标题】:What is this Type in .NET (Reflection).NET 中的这个类型是什么(反射)
【发布时间】:2011-09-18 03:38:32
【问题描述】:

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

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

【问题讨论】:

标签: c# .net reflection


【解决方案1】:

几乎可以肯定它是编译器由于 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;
        }
    }
}

... 除了使用&lt;&gt;c_displayClass1 作为名称而不是ExtraClass。这是一个难言的名字,因为它不是有效的 C# - 这意味着 C# 编译器肯定知道它不会出现在您自己的代码中并且不会与其选择发生冲突。

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

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

【讨论】:

  • 很好的解释。接受(时机成熟时)
  • 有没有办法阻止这种情况发生?
  • @Vinnyq12:除了“不要使用捕获 this 以外的变量的 lambda 表达式”?
  • @JonSkeet API 需要一个表达式作为参数。当我明确设置参数时,它被接受,但如果我动态构建表达式,则会创建“ExtraClass”并且不再被接受:(API 是 SharePoint。
  • @Vinnyq12:听起来你应该问一个更详细的单独问题。
【解决方案2】:

乔恩当然是正确的。我提供了一个“解码器环”来弄清楚各种编译器生成的类型名称在这里的含义:

Where to learn about VS debugger 'magic names'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-16
    • 2017-04-21
    • 2014-08-18
    • 1970-01-01
    • 2011-02-05
    • 2020-01-19
    • 1970-01-01
    • 2019-03-10
    相关资源
    最近更新 更多