私はこのようなものを持っています:
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() のジェネリック型パラメーターをこれら 3 つのクラスのいずれかに制限することで、コンパイラーが何をすべきかを理解できるようになることを期待していました。
しかしwhere T : Type1, Type2, Type3
、違法のようです。
これを解決するにはどうすればよいですか?
GetPageRows() のアルゴリズムは一般的であり、取得する特定の種類の行に依存しないという考え方です。戻り値の型と述語のみが T に依存します。
編集:基本型と共通の空のインターフェイスで制約を試みましたが、var filteredQueryable = GetRowsAndFilter(predicate);
. 「メソッドを解決できません」。これらのメソッドの正しいバージョンを選択する方法がわかりません。どうすればいいのかわからない。GetPageRows() の一般的なアルゴリズムを、実際の型 T と、GetRowsAndFilter() の異なるバージョンにある各 T の特定の異なるクエリから分離できる必要があります。