我需要實現基於擴展方法的API(即,我必須使用靜態非泛型類)。 API應該與LINQ流利的API一起工作,並且主要使用IQueryable參數。就像這樣:可選泛型參數的擴展方法
public static class SomeExtensions
{
public static IQueryable<TEntity> SomeMethod<TEntity>(this IQueryable<TEntity> set, ... some arguments)
{
}
}
現在,假設該方法應該採取一些參數加上Expression<Func<TEntity, TResult>>
之一:
public static IQueryable<TEntity> SomeMethod<TEntity, TResult>(
this IQueryable<TEntity> set,
...,
Expression<Func<TEntity, TResult>> orderByExpression)
{
}
我想通過orderByExpression以流暢的API的排序依據的方法。或者如果orderByExpression == null
做一些其他的事情。
當然,我想有這樣的事情:
public static IQueryable<TEntity> SomeMethod<TEntity, TResult>(
this IQueryable<TEntity> set,
...,
Expression<Func<TEntity, TResult>> orderByExpression = null)
{
}
...但調用此方法W/O可選參數我要含蓄通過泛型類型,當因爲編譯器不知道TResult的類型。
我看到一些可能的方法,但我不太喜歡它們。
定義兩個方法:一個用這個參數和一個w/o,並從第二個調用第一個。我不喜歡它,因爲實際上,API中有很多這樣的方法,我必須爲它們中的每一個定義一個附加方法。
使用
Expression<Func<TEntity, object>>
而不是Expression<Func<TEntity, TResult>>
(現在是這樣)。我擺脫了泛型類型,但是像int這樣的簡單(值)類型存在問題:在嘗試將System.Int32強制轉換爲System.Object時,LINQ會引發異常。也許(還沒有嘗試過)我可以使用
Expression<Func<TEntity, dynamic>>
- 但我不認爲這是一個好方法。
任何其他的想法,任何人?
'Enumerable'和'Queryable'類是設計這種API的好例子。解決方案是選項(2),無論您需要添加多少重載。 –
@IvanStoev你不是說選項(1)? – Kapol
@卡波爾絕對!一個愚蠢的打字錯誤,謝謝。 –