我有這樣的事情: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
我想我可能會有一些東西,我已經修改了我的答案,但不確定它是否可行,並且可能會使代碼共享失去很多好處 –