【问题标题】:Why in c# can't we wrap anonymous objects in list of objects?为什么在 c# 中我们不能将匿名对象包装在对象列表中?
【发布时间】:2015-08-09 09:21:23
【问题描述】:

为什么在 c# 中我们不能将匿名对象包装在对象列表中? 例如,我在 StackOverFlow 中看到了 this Question 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 的列表中,但实际上我不明白为什么在运行时我们无法获取它们的值。

【问题讨论】:

  • 您究竟是如何将匿名包装在动态列表中?我刚刚做了一个简单的测试,看起来from dynamic prod in ... 有效。

标签: c# linq compilation runtime


【解决方案1】:

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

如果您将匿名类型实例添加到 List&lt;object&gt;,您会将它们向上转换object,并且您会丢失输入本身,因此,您无法访问匿名类型实例属性。

您应该使用其他解决方案,而不是将它们存储在List&lt;dynamic&gt; 中:存储在匿名类型的通用列表中。由于您无法访问匿名类型名称(它是匿名的,它们没有名称 - 好吧,它们编译成实际的类,但这是编译/运行时内部的工作方式,这是一个低级细节),你不能使用显式类型,但是 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`>!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多