如果匿名类型对象不可枚举,它如何转换为字符串?

Dar*_*ous 1 c#

假设我定义了一个这样的变量:

var o = new { RBI = 108, Name = "Roberto Alamar" };
Run Code Online (Sandbox Code Playgroud)

我可以这样做:

Console.WriteLine("{0}", o);
Run Code Online (Sandbox Code Playgroud)

但如果我尝试:

foreach (var i in o) {
    Console.WriteLine("{0}", o[i]);
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

foreach statement cannot operate on variables of type 'AnonymousType#1' because 'AnonymousType#1' does not contain a public definition for 'GetEnumerator'
Run Code Online (Sandbox Code Playgroud)

那么它如何在引擎盖下工作?我认为将对象转换为字符串的方法必须循环遍历所有属性才能完成任务.是否有一些特殊方法可以实现这一点,或者我误解了它是如何工作的?

Eri*_*ert 8

它是如何在引擎盖下工作的?我认为将对象转换为字符串的方法必须循环遍历所有属性才能完成任务.

您的假设是ToString的实现在所有匿名类型的所有实例之间共享; 例如,有一些帮助器在逻辑上就像你在JavaScript中做的那样:

var s = "";
for (property in this)
   s += property + ":" + this[property];
Run Code Online (Sandbox Code Playgroud)

这个假设是错误的; 对于匿名类型,没有单一的"适合所有"ToString实现.相反,编译器知道匿名方法的所有属性是什么,因此它为每个不同的匿名类型生成一个全新的ToString自定义实现.

在C#中,foreach循环不会执行for-in循环在JavaScript中执行的操作.C#循环枚举集合成员.JS循环枚举对象属性.

如果你想在C#中枚举对象的属性,你可以这样做,它只需要更多的工作:

var s = "";
foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
   s += propertyInfo.Name + ":" + propertyInfo.GetValue(this).ToString();
Run Code Online (Sandbox Code Playgroud)