为什么在c#中我们不能将匿名对象包装在对象列表中?
例如,我在StackOverFlow C# Linq, object definition does not contains a property
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
列表中,但实际上我无法理解为什么在运行时我们无法获得它们的值。
答案 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`>!