我有一个通用的分页方法,我试图调用它。 但我得到一个编译时错误: 无法从使用
推断出方法的类型参数方式:
public static IQueryable<T> OrderedPagedResults<T, TResult, TType>(IQueryable<T> query, int pageNum, int pageSize,
Expression<Func<T, TResult>> orderByProperty, bool isAscendingOrder, out int rowsCount,
List<KeyValuePair<Expression<Func<T, TType>>, bool>> lstThenByConditions = null)
{
if (pageSize <= 0) pageSize = 20;
rowsCount = query.Count();
if (rowsCount <= pageSize || pageNum <= 0) pageNum = 1;
var excludedRows = (pageNum - 1) * pageSize;
query = isAscendingOrder ? query.OrderBy(orderByProperty) : query.OrderByDescending(orderByProperty);
if (lstThenByConditions != null && lstThenByConditions.Any())
{
foreach (var thenByProperty in lstThenByConditions)
{
if (!thenByProperty.Equals(default(KeyValuePair<Expression<Func<T, TType>>, bool>))
&& (typeof(IOrderedQueryable<T>).IsAssignableFrom(query.Expression.Type)))
{
query = thenByProperty.Value
? (query as IOrderedQueryable<T>).ThenBy(orderByProperty)
: (query as IOrderedQueryable<T>).ThenByDescending(orderByProperty);
}
}
}
return query.Skip(excludedRows).Take(pageSize);
}
我试图将其调用为:
var resultset = OrderedPagedResults(employees, pageNum, rowNum,
o => o.JoiningDate, isSortAscending, out totalRows);
员工= IQueryable 由于某种原因,我得到这个编译时错误,我无法调用它。
有什么建议我在这里缺少什么?
答案 0 :(得分:2)
编译器虽然相当聪明,但并不总是能够推断泛型类型,例如这里的情况,因为有多种泛型类型。它是如何知道它们应该是什么的?你需要更明确:
var resultset = OrderedPagedResults<IEnumerable<Employee>, int, int>
(employees, pageNum, rowNum, o => o.JoiningDate, isSortAscending, out totalRows);
(我猜那里的类型)
Eric Lippert在某个地方有一个很好的解释,但我不记得它在哪里。
答案 1 :(得分:2)
Stuart Grassie的回答是正确的,但省略了详细说明您获得错误的原因。 在您的示例中,编译器应该从哪个参数推导出您打算用于类型参数TType
的类型参数?
我找不到任何这样的论点;编译器也不能,因此你没有给它足够的信息来推断出类型。