返回AnonymousType#1的数据类型

本文关键字:数据类型 AnonymousType#1 返回 | 更新日期: 2023-09-27 18:11:53

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<AnonymousType#1>System.Collections.Generic.List<object>

如何正确完成?谢谢你。

返回AnonymousType#1的数据类型

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

你可以试试这个:

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

你得到这个错误的原因是

Select(r => 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();
}

这不起作用,因为List<T>不是协变的——它是一个特定类型的列表,所以你不能向它添加任何对象。

  1. 创建一个具体的类型并使用它
  2. 将结果强制转换为object:

    .Select(r => (object)(new { r.FirstName, r.LastName }))
    
  3. 将返回类型更改为IEnumerable<object>,其中协变(因为您不能添加它)

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