我对泛型还很陌生,所以我想知道是否有人可以解释我遇到的以下问题。在 ASP.NET MVC 应用程序的几乎所有 Controller 中,我需要返回一个过滤列表(以填充 JqGrid,因为它发生在用户将指定某些过滤条件的地方)。每个 Controller 列表方法将返回一个不同的 IQueryable 列表,因此我着手创建一个通用方法来处理这个问题。
当我创建我的方法时,我在一个特定的 Controller 中定义了它。一切都编译好了,我得到了我预期的结果。因为我想从我的所有 Controller 调用此方法,所以我假设我可以简单地创建另一个静态类,将方法放在那里,然后从我的所有 Controller 调用该方法。但是如果我尝试将该方法移动到调用它的 Controller 以外的任何其他地方,编译器会提示该方法的最后一行并出现以下错误:
方法的类型参数 System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>,
System.Linq.Expressions.Expression<System.Func<TSource,bool>>)
不能从用法中推断出来。
尝试明确指定类型参数。
public static IQueryable<T> FilteredList<T>(IQueryable<T> list, string filters)
{
var qb = new QueryBuilder<T>();
var whereClause = qb.BuildWhereClause(filters);
return list.Where(whereClause);
}
我试过了 list<T>.Where(whereClause)
和 list.Where<T>(whereClause)
以及几乎所有其他组合,任何人都可以向我解释我哪里出错了。
最佳答案
这表明您的 BuildWhereClause
方法未返回适当的类型。
编译器正在尝试推断 TSource
的类型来自 list
和 whereClause
.现在whereClause
应该是Expression<Func<T, bool>>
但我怀疑不是。将鼠标悬停在 var
上在 whereClause
的声明中找出它到底是什么。我不推荐使用 var
当返回类型不明显时。
关于c# - 无法从用法中推断出类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1504778/