簡體   English   中英

將匿名集合放入類中

[英]Putting an Anonymous collection into a Class

我有一個鏈接查詢,它返回不同的數據列表以填充網頁上的不同網格,但它總是返回一些標准屬性以及一組匿名對象。

所以我想要一個具有3個int屬性的類,包括'Total','Page'和'Count',然后是一個屬性,它是一個集合。 我仍然希望更改屬性,以便我可以使用此對象返回多種類型的查詢。 我知道我可以“硬輸入”每個查詢,但是有很多查詢變體,最好有一個接受匿名集合的泛型類。

我試過使用的屬性

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

您可以創建泛型類

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

最好有一個接受匿名集合的泛型類

然后你應該使你的類型通用,類似於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>IEnumerable<object>是安全的。

還有一個選項是首先創建包含匿名類型對象的List<object> 為此,請在調用ToList時指定類型: .ToList<object>()而不是.ToList()

建議泛型類型的其他答案肯定是有意義的,但是因為你將這些數據傳遞給另一個必須反映到類中的類,所以你可以使用一個對象列表。

這樣做需要將匿名實例強制轉換為查詢的一部分,如下所示:

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現在將是一個對象列表,而不是匿名類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM