为什么在c#中我们不能将匿名对象包装在对象列表中?

时间:2015-08-09 09:21:24

标签: c# linq compilation runtime

为什么在c#中我们不能将匿名对象包装在对象列表中? 例如,我在StackOverFlow C# Linq, object definition does not contains a property

中看到了this Question
var anynomousObject = new { Amount = 10, weight = 20 };

List<object> ListOfAnynomous = new List<object> { anynomousObject, anynomousObject };
var productQuery =
            from prod in ListOfAnynomous
            select new { prod.Amount, prod.weight };

foreach (var v in productQuery)
{
    Console.WriteLine(v.Amount);
    Console.WriteLine(v.weight);
}

答案是他应该将匿名包装在dynamic列表中,但实际上我无法理解为什么在运行时我们无法获得它们的值。

1 个答案:

答案 0 :(得分:2)

匿名类型也是类型,它们被编译成实际的类。 也就是说,匿名并不意味着无类型

如果您将匿名类型实例添加到List<object>,那么您将向上转播它们到object并且您丢失了输入本身,因此,您无法访问匿名类型实例属性。

不应将它们存储在List<dynamic>中,而应该使用其他解决方案:存储在匿名类型的通用列表中。由于你无法访问匿名类型名称(它是匿名的,它们没有名字 - 好吧,它们编译成实际的类,但这是内部在编译/运行时工作的方式,它是一个低级细节),您不能使用显式类型,但C#具有类型推断变量:

// compiles to string a = "hello"; assignment defines the type
var a = "hello"; 

......那么,这个怎么样?

// Use a type-inferred array to define the items and then convert the array
// to list!
// Now you can use each anonymous type instance properties in LINQ ;)
var listOfAnonymousInstances = new [] { new { Amount = 10, weight = 20 } }.ToList();
// If you mouse over the var keyword, you'll find that it's a List<a`>!