将匿名集合放入类中

时间:2013-12-09 11:17:03

标签: c# linq generics

我有一个链接查询,它返回不同的数据列表以填充网页上的不同网格, 但它总是返回一些标准属性以及一组匿名对象。

所以我想要一个为'Total','Page'和'Count'提供3个int属性的类 然后是属于集合的属性。我仍然希望更改属性,以便我可以使用此对象返回多种类型的查询。我知道我可以“硬输入”每个查询,但是查询的变化很多,最好有一个接受匿名集合的泛型类。

我尝试过使用

的属性
List<object> myQueryCollection

但得到错误:

  

错误205无法隐式转换类型   System.Collections.Generic.List<AnonymousType#1>来   System.Collections.Generic.List<object>

如何获得一个具有3个int属性的类和一个接受匿名类型的Collection属性。

我想从我的商业层传递一个适当的对象到我的观点......

var jsonData = new {
      total = totalPages,
      page = gridSettings.PageIndex,
      records = counter,
      rows = (from c in ucs select new {id = c.id, createDate =         
        c.CreateDate}).ToList()
};

3 个答案:

答案 0 :(得分:4)

您可以创建泛型类

public class Result<T>
{
    public int Total { get; set; }
    public int Page { get; set; }
    public int Count { get { return Items.Count; } }
    public List<T> Items { get; set; }
}

使用匿名类型创建此类实例的扩展方法:

public static Result<T> ToResult<T>(this List<T> source)
{
    return new Result<T> { Items = source };
}

用法:

var result = yourList.ToResult();

答案 1 :(得分:3)

  

最好有一个接受Anonymous集合的通用类型的类

然后你应该使你的类型通用,类似于lazyberezovsky在他的回答中建议的。您需要利用类型推断,这对构造函数不起作用。但您可以使用static工厂方法:

public static class ResultFactory
{
    public static Result<T> Create<T>(int total, int page, List<T> items)
    {
        return new Result<T> { Total = total, Page = page, Items = items };
    }
}

用法:

var data = ResultFactory.Create(
      totalPages,
      gridSettings.PageIndex,
      (from c in ucs select new { c.id, createDate = c.CreateDate }).ToList());

如果您不想这样做,可以使用协变界面,例如IEnumerable(或IReadOnlyList,如果您使用的是.Net 4.5)而不是List。您无法将List<AnonymousType>投射到List<object>(或IList<object>),因为这样做不安全。但将它投射到IEnumerable<object>是安全的。

另一个选择是首先创建包含匿名类型对象的List<object>。为此,请在调用ToList时指定类型:.ToList<object>()而不是.ToList()

答案 2 :(得分:0)

建议泛型类型的其他答案肯定是有意义的,但是因为你将这些数据传递给另一个必须反映到类中的类,所以你可以使用一个对象列表。

执行此操作需要将匿名实例强制转换为查询的一部分,如下所示:

var jsonData = new {
      total = totalPages,
      page = gridSettings.PageIndex,
      records = counter,
      rows = (from c in ucs select new {id = c.id, createDate =         
        c.CreateDate}).Cast<Object>().ToList()
};

jsonData.rows现在将是一个对象列表,而不是匿名类型。