【问题标题】:Building a generic filter parameter inputs interface?构建通用过滤器参数输入接口?
【发布时间】:2011-09-09 17:38:43
【问题描述】:

我有接受不同输入的方法调用,即:

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),它可以采用不同的过滤器对象,但不确定从哪里开始。有什么建议或建议吗?

谢谢。

【问题讨论】:

标签: c# .net generics interface


【解决方案1】:

在我看来,我会使用抽象类来完成您正在寻找的内容。您可以为每种搜索类型创建一个接口,但是您必须每次都实现该接口,并且您在 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; }
}

【讨论】:

【解决方案2】:

听起来您想在所有过滤器之间共享一些功能。您希望实现这一点的方式不一定是通过接口,而是通过抽象基类。此外,因为您将过滤不同的对象,所以使用泛型是有意义的。您可能会遇到以下情况:

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);
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多