我有这样的事情:C#泛型方法类型约束对几类
public List<T> GetPageRows<T>(Expression<Func<T, bool>> predicate, List<ColumnSortOrder> sortOrder, int pageSize, int pageNo) where T : Type1, Type2, Type3
{
var filteredQueryable = GetRowsAndFilter(predicate);
var orderedQueryable = GetOrderedQueryable(sortOrder, filteredQueryable);
var pagedQueryable = orderedQueryable.Skip((pageNo - 1) * pageSize).Take(pageSize);
return pagedQueryable.ToList();
}
private IQueryable<Type1> GetRowsAndFilter(Expression<Func<Type1, bool>> predicate)
{
return GetType1s(predicate);
}
private IQueryable<Type2> GetRowsAndFilter(Expression<Func<Type2, bool>> predicate)
{
return GetType2s(predicate);
}
private IQueryable<Type3> GetRowsAndFilter(Expression<Func<Type3, bool>> predicate)
{
return GetType3s(predicate);
}
我希望,通过使GetRowsAndFilter()的非通用类特定版本,然后是制约GetPageRows泛型类型参数()分配给这三个类中的一个,编译器能够找出该做什么。
但是where T : Type1, Type2, Type3
似乎是非法的。
我该如何解决这个问题?
这个想法是,GetPageRows()中的算法是通用的,并且不依赖于我得到的特定类型的行。只有返回类型和谓词取决于T.
编辑:我试图约束他们的基类型和共同的空接口,但我仍然在var filteredQueryable = GetRowsAndFilter(predicate);
中得到一个错误。 “无法解析方法”。它不知道如何选择这些方法的正确版本。我不知道该怎么办。应该可以将实际类型T中的GetPageRows()中的一般算法与不同版本的GetRowsAndFilter()中的每个T的特定不同查询分开。
约束问题可以解决,但不幸的是,这不会解决后续的不可解析的方法调用问题。 –
没办法解决这个问题呢?:( – pinkfloydhomer
我想我可能会有一些东西,我已经修改了我的答案,但不确定它是否可行,并且可能会使代码共享失去很多好处 –