创建通用扩展方法以提供过滤功能

时间:2012-02-13 05:33:43

标签: c# asp.net-mvc generics extension-methods

我正在研究一种扩展方法,为多个实体提供过滤功能。涉及的实体属于不同类型,但具有可以搜索的公共字段。

下面的工作正在进行中,但是我想知道这是否可以“通用化”,以便不需要发生从泛型到显式类型的转换?

public static IQueryable<T> PriceLow<T>(this IQueryable<T> query, decimal? priceLow)
{
    if (typeof(T) == typeof(Entity1))
    {
        var innerQuery = (IQueryable<Entity1>) query;
        var results = priceLow.HasValue ? innerQuery.Where(o => (o.ListPrice > priceLow.Value)) : innerQuery;
        return (IQueryable<T>) results;
    }

    if (typeof(T) == typeof(Entity2))
    {
        var innerQuery = (IQueryable<Entity2>)query;
        var results = priceLow.HasValue ? innerQuery.Where(o => (o.ListPrice > priceLow.Value)) : innerQuery;
        return (IQueryable<T>)results;
    }

    return null;
}

使用示例:

    var foo = _repository.GetAllEntity1().PriceLow(_searchCritera.PriceLow);

3 个答案:

答案 0 :(得分:3)

如果您可以更改两个实体类型以实现具有共享属性/方法的公共接口,则可以使用泛型类型约束。这也适用于共享基类。

这样做,然后你的签名看起来像这样(忽略了混乱的细节):

public static IQueryable<T> PriceLow<T>(...)
  where T : ICommonInterface

答案 1 :(得分:2)

如何使实体从包含可搜索字段的基类继承。这样,您的过滤方法只需要了解一种基本类型。

答案 2 :(得分:1)

一种方法是定义一个接口并将该接口添加为您的类继承的东西之一。界面根本不需要包含任何内容。它可以用作标记。

然后使你的扩展方法需要参数就是那个接口。