【问题标题】:Return data type for an AnonymousType#1AnonymousType#1 的返回数据类型
【发布时间】:2014-08-29 08:26:06
【问题描述】:

AnonymousType#1 的正确返回数据类型是什么?

此代码正在运行。

var c = p.IQueryableGetAll()
         .Where(r => r.Gender == "M")
         .Select(r => new { r.FirstName, r.LastName })
         .ToList();

但是当我把它放在一个函数中时,就会发生错误。

public List<object> GetFirstNameAndLastNameOfMales()
{
   var p = new Program();
   return p.IQueryableGetAll()
           .Where(r => r.Gender == "M")
           .Select(r => new { r.FirstName, r.LastName })
           .ToList();
}

这是错误

不能隐式转换类型 System.Collections.Generic.List&lt;AnonymousType#1&gt;System.Collections.Generic.List&lt;object&gt;

它是如何正确完成的?谢谢。

【问题讨论】:

  • 你为什么想要返回一个匿名类型?如果您需要使用匿名类型的内容超过单个方法的范围,只需创建一个命名类来保存数据。
  • 我只想要一个瞬间

标签: c# .net types return


【解决方案1】:

您在这两种情况下的查询都是正确的。然而,在第二种情况下导致问题的是您的方法的返回类型。

你可以试试这个:

 return p.IQueryableGetAll()
         .Where(r => r.Gender == "M")
         .Select(r => new { r.FirstName, r.LastName }).ToList<Object>();

你得到这个错误的原因是因为

Select(r =&gt; new { r.FirstName, r.LastName })

为序列中具有Gender==M 的每个元素选择一个匿名类型。查询末尾的 .ToList() 会创建一个 List 对象,这些对象的类型是具有这两个属性的匿名类型。

更好的选择是创建一个包含这两个属性的类,我们称之为Customer,然后执行以下操作:

public List<Customer> GetFirstNameAndLastNameOfMales()
{
    var p = new Program();
    return p.IQueryableGetAll()
            .Where(r => r.Gender == "M")
            .Select(r => new Customer { 
                    FirstName = r.FirstName, 
                    LastName = r.LastName
            }).ToList();
}

【讨论】:

  • 当然可以,但最好指出返回转换为 object 的匿名类型应该重新考虑两次。
  • 为什么?这是一种不好的做法吗?
  • @KonradKokosa 感谢您的评论!这就是为什么我说更好的选择是创建一个替换匿名类型的类。
  • @Ryan 我说这不是一个好习惯,因为您已经编写了一个获取所有男性姓氏和名字的方法。由于您需要所有男性的此信息,因此您可以使用一个对象来为每个男性保存它,然后组成它们的集合并将其返回给您的方法的调用者。
  • @Ryan 你打算如何使用这个对象?你不能用它任何事情。
【解决方案2】:

它不起作用,因为List&lt;T&gt; 不是协变的——它是一个特定类型的列表,所以你不能向它添加任何对象。您可以:

  1. 创建一个具体类型并使用它
  2. 将结果转换为对象:

    .Select(r => (object)(new { r.FirstName, r.LastName }))
    
  3. 将返回类型更改为IEnumerable&lt;object&gt;,这协变的(因为您无法添加)

选项 1 是最简洁的,但需要额外的代码 - 选项 2 和 3 在查询端很容易,但在客户端需要反射或 dynamic(以及运行时漏洞,缺乏编译时安全性等) .).

【讨论】:

  • @D Stanley 我会很感激你,如果你能看看我的帖子并告诉我哪里错了,因为我投了反对票,没有评论指出我在哪里错误的。非常感谢您!
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多