返回AnonymousType#1的数据类型

时间:2014-07-08 14:34:19

标签: c# .net types return

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>

如何正确完成?谢谢。

2 个答案:

答案 0 :(得分:2)

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

你可以尝试这个:

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

答案 1 :(得分:0)

它不起作用,因为List<T>不是协变的 - 它是特定类型的列表,因此您无法向其添加任何对象。你可以:

  1. 创建具体类型并使用它
  2. 将结果投射到对象:

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

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