【问题标题】:What's this Anonymous Type concrete Type?这个匿名类型具体类型是什么?
【发布时间】:2011-07-13 10:47:03
【问题描述】:

我最近在 StackOverflow 上浏览 this question,看着接受的答案,我想知道实际的具体类型是什么

var ordinals = new {
                       Test1 = SomeFunctionReturningInt32("Test1"),
                       Test2 = SomeFunctionReturningInt32("Test2")
                   };

这会导致 MSIL 做什么?

【问题讨论】:

  • var type = ordinals.GetType(); 是编译时生成的。类型应该与您无关。

标签: .net anonymous-types


【解决方案1】:

它被编译成程序集中的通用内部类型。比如:

internal sealed class SomeCompilerGeneratedNameHere<T1, T2>
{
    public SomeCompilerGeneratedNameHere(T1 test1, T2 test2)
    {
        ...
    }

    public T1 Test1 { get { ... } }
    public T2 Test2 { get { ... } }

    // Overrides for Equals, ToString, GetHashCode
}

那么在你的情况下,它将使用SomeCompilerGeneratedNameHere&lt;int, int&gt;。 (名称本身是一个“难以言说”的名称,因此您不能在代码中明确引用它,并且不会与有效的 C# 类型发生任何命名冲突。)

我不记得构造函数和属性是否实际上是公共的,或者它们是否也是内部的 - 我知道类型本身是内部的。

具有相同属性名称且顺序相同的所有匿名类型将使用相同的泛型类型,只是可能具有不同的类型参数。

请注意,这是特定于实现的 - 我不相信规范保证将使用泛型类型;每个使用的匿名类型可能有一种类型。规范确实保证两个匿名类型创建表达式将使用相同的类型,如果它们具有相同的属性名称​​和类型以相同的顺序。

【讨论】:

  • 这很有趣,我刚刚在ildasm 中打开了我的程序集(ildasm 在底部显示了所有编译生成的匿名类型)并发现对于我的案例编译器生成了单个匿名类型(我是使用相同的匿名类型将Name - Value 参数多次传递给方法)。所以Single anonymous type 生成-规范在这种情况下有效。
【解决方案2】:

类型是

<>f__AnonymousType0`2[System.Int32,System.Int32]

或类似的东西。 您可以像这样轻松地自己找到它:

Console.WriteLine(ordinals.GetType());

【讨论】:

    【解决方案3】:

    这将是一个名称类似于 &lt;&gt;f_AnnonymousType03` 的类 - 取决于各种参数。 See also

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      相关资源
      最近更新 更多