我搞砸了匿名类型,然后不小心将其输出到控制台。它看起来基本上是我的定义方式。
这是一个复制它的简短程序:
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进行了反编译,因此请尝试查看Root Namespace。在这里,您会发现类似于以下内容的内容:
[DebuggerDisplay("\\{ Test = {Test}, Integer = {Integer}, s = {s} }", Type = "<Anonymous Type>")]
internal sealed class <>__AnonymousType0<<Test>
这是定义匿名对象时编译生成的示例。
关于c# - 匿名类型的ToString如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16794275/