想象一个类,比如用于分页的类,可以与 IList<T>
或 IQueryable<T>
一起使用。
该类将具有一个 int TotalItems
属性,它将(并不令人惊讶地)获取/设置可查询或可枚举参数的计数。
如果我将参数设置为 IEnumerable<T>
,
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
Count()
方法将会是 Enumerable.Count()
, 这也就是说,即使查询(query)是一个继承自 IEnumerable<T>
的 IQueryable<T>
,它仍将被枚举 (这显然不是希望看到的"数据库查询"行为)。
那么,当我的 IEnumerable<T>
实际上是一个 IQueryable<T>
时,是否有方法可以使用 Queryable.Count()
方法,或者我必须更改设计,在这种情况下例如拥有两个构造函数?
//simplified
public Pagination(IEnumerable<T> query)
{
TotalItems = query.Count();
}
public Pagination(IQueryable<T> query)
{
TotalItems = query.Count();
}
编辑
我确实明白 IQueryable<T>
继承自 IEnumerable<T>
和 IEnumerable<T>
和 IQueryable<T>
有相同名称的扩展方法并没有任何关系,而且拥有“看起来做同样事情”的相同名称扩展方法很好,但我仍然认为有时会令人困惑...
好奇的泛型问题
在框架中,是否还有其他具有相同“架构”的示例:继承 + 具有公共扩展方法的相同名称?