c# – 匿名类型的ToString如何工作?

我搞错了匿名类型,我不小心把它输出到控制台上。它看起来基本上是如何定义的。

这是一个简短的程序,重现它:

using System;
class Program
{
    public static void Main(string[] args)
    {
        int Integer = 2;
        DateTime DateTime = DateTime.Now;
        Console.WriteLine(new { Test = 0, Integer, s = DateTime });
        Console.ReadKey(true);
    }
}

现在的输出是:

{ Test = 0, Integer = 2, s = 28/05/2013 15:07:19 }

我尝试使用dotPeek进入大会,找出原因,但没有帮助。[1]这是dotPeek的代码:

// Type: Program
// Assembly: MyProjectName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
// Assembly location: Not telling you! :P
using System;
internal class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine((object) new
    {
      Test = 0,
      Integer = 2,
      s = DateTime.Now
    });
    Console.ReadKey(true);
  }
}

所以没有什么不同。

那么它如何工作?它如何输出呢?

笔记:

[1]:我忘了打开“显示编译器生成的代码”,这就是我没有得到它的工作原理的原因。

只是为了向HuorSwords答案添加一些代码,编译器将为您的示例生成ToString方法,如下所示:

public override string ToString()
{
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.Append("{ Test = ");
    stringBuilder.Append((object) this.<Test>__Field);
    stringBuilder.Append(", Integer = ");
    stringBuilder.Append((object) this.<Integer>__Field);
    stringBuilder.Append(", s = ");
    stringBuilder.Append((object) this.<s>__Field);
    stringBuilder.Append(" }");
    return ((object) stringBuilder).ToString();
}

当您在编译时都需要所有元数据时,这里使用反射将是效率低下的。

使用dotPeek进行解压缩,此版本可能因使用的反编译器而异。

注意:由于您也使用dotPeek反编译,请尝试查看根命名空间。在那里你会发现类似的东西:

[DebuggerDisplay("\\{ Test = {Test}, Integer = {Integer}, s = {s} }", Type = "<Anonymous Type>")]
internal sealed class <>__AnonymousType0<<Test>

当您定义匿名对象时,这是一个编译生成的示例。

http://stackoverflow.com/questions/16794275/how-does-tostring-on-an-anonymous-type-work

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 匿名类型的ToString如何工作?