我有一个链接查询,它返回不同的数据列表以填充网页上的不同网格, 但它总是返回一些标准属性以及一组匿名对象。
所以我想要一个为'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()
};
答案 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
现在将是一个对象列表,而不是匿名类型。