构建通用过滤器参数输入接口?

时间:2011-09-09 17:38:43

标签: c# .net generics interface

我的方法调用采用不同的输入,即:

public Authors GetAuthors(string name, string sortBy, string sortDir, int startRow, int numRow)
{
    // Get authors based on filters
}

public Books GetBooks(string id, string year, string sortBy, string sorDir, int startRow, int numRow)
{
    // Get books based on filters
}

我打算改变它,以便过滤器是对象,即:

public Authors GetAuthors(GetAuthorsFilters filters)
{
    // Get authors based on filters
}

public Books GetBooks(GetBooksFilters filters)
{
    // Get books based on filters
}

但是很多过滤器在这些方法中很常见,我想为此构建一个通用接口(即IFilter),它可以使用不同的过滤器对象,但不知道从哪里开始。有任何建议或建议吗?

感谢。

2 个答案:

答案 0 :(得分:3)

在我看来,我会使用抽象类来完成你想要的东西。您可以为每种搜索类型创建一个接口,但是每次都必须实现该接口,并且看起来BookFilters和AuthorFilters中的共享属性之间没有编程差异。也许是这样的:

public abstract class BaseFilter
{
    public string SortBy { get; set; }
    public bool SortAscending { get; set; }
    public int RowStart { get; set; }
    public int RowCount { get; set; }
}

public class BookFilter : BaseFilter
{
    public string ISBN { get; set; }
    public int Year { get; set; }
}

public class AuthorFilter : BaseFilter
{
    public string Name { get; set; }
}

答案 1 :(得分:3)

听起来您希望在所有过滤器之间拥有一些共享功能。您希望实现此方法的方式不一定是通过接口,而是通过抽象基类。另外,因为您将对不同的对象进行过滤,所以使用泛型是有意义的。您可以使用以下内容:

public class FilterBase<T> {
    protected int startRow;
    ...

    public FilterBase(Func<T, IComparable> sortBy, bool sortAscending, int startRow, int numRow) {
        //assigns to member variables
    }

    public IEnumerable<T> Filter(IEnumerable<T> toFilter) {
        filtered = DoFiltering(toFilter);
        filtered = DoPaging(filtered);
        filtered = DoSorting();
        return filtered;
    }

    protected abstract IEnumerable<T> DoFiltering(IEnumerable<T> toFilter);
    protected virtual IEnumerable<T> DoPaging(IEnumerable<T> toFilter) {
        return toFilter.Skip(startRow).Take(numRow);
    }
    protected virtual IEnumerable<T> DoSorting(IEnumerable<T> toFilter) {
        return sortAscending ? toFilter.OrderBy(sortBy) : toFilter.OrderByDescending(sortBy);
    }
}

public class BookFilter : FilterBase<Book> {
    public BookFilter(string id, string year, string sortBy, string sorDir, int startRow, int numRow) : base(sortBy, sorDir, startRow, numRow) {
        //assign id and year to member variables
    }

    protected override IEnumerable<Book> DoFiltering(IEnumerable<Book> toFilter) {
        return toFilter.Where(b => b.Id == id && b.Year == year);
    }
}

这将允许您为所有类型的过滤器定义一次分页和排序逻辑,并使每种类型根据其私有成员和它们所引用的对象类型定义自己的自定义过滤。