[英]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.