可以看到,Predicate<T>委托类型的方法MatchRule和前面几乎没有区别,唯一的不同是改成了虚拟方法,以便在子类中覆盖它,以支持对更多列(属性)的筛选。还有值得注意的地方是这个泛型类使用了约束,我们要求类型参数T必须实现IDate接口。
实际上这个类通常用作基类(也可以直接使用,非抽象类),现在来看下如果我们希望可以对Country也进行筛选,应该如何扩展它:
// 可以添加对国家的筛选
public class OrderFilter : DateFilter<Order>
{
private string country;
public OrderFilter(int year, int month, int day, string country)
: base(year, month, day) // 调用基类构造函数
{
this.country = country;
}
public override bool MatchRule(Order item)
{
// 先获取基类关于日期的对比结果
bool result = base.MatchRule(item);
if (result == false) // 如果日期都不满足,直接返回false
return false;
// 继续进行 country 的对比
if (String.IsNullOrEmpty(country) || string.Compare(item.Country, country, true) == 0)
{
return true;
} else
{
return false;
}
}
}
我们现在为OrderManager类添加一个新方法,使用我们上面创建的OrderFilter,看看它是什么样的,它仅仅是