2013-12-19 59 views
2

是這種方式強制C#使用返回類型推斷一個非常糟糕的做法?C#返回類型推斷不好的做法?

所以我有一個這樣的接口:

public interface IQueryHandlerRunner 
{ 
    TResult RunHandler<TQuery, TResult>(TQuery query) 
     where TQuery : IQuery; 
} 

我用它是這樣的:

_queryHandlerRunner.RunHandler<GiveMeAllPreferedCustomersQuery, PreferedCustomersDto[]>(
    new GiveMeAllPreferedCustomersQuery()); 

但我希望能夠使用的返回類型推斷,但我知道,能不能做到....

那麼它實際上可以,所以我創建了這樣一個過載:

TResult RunHandler<TQuery, TResult>(TQuery query, TResult result) 
    where TQuery : IQuery; 

我用它是這樣的:

_queryHandlerRunner.RunHandler(new GiveMeAllPreferedCustomersQuery(), default(PreferedCustomersDto[])); 

感覺更乾淨的做法,但在同一時間,感覺髒笑像一聞

你覺得

我不t喜歡這樣一個事實,即我在API中引入返回類型作爲參數,但對我的api的調用看起來更好,更易於閱讀

我在這裏瘋了嗎?或者我應該立即停止吸菸......我很困惑

+3

http://blog.slaks.net/2010/12/partial-type-in​​ference-in-net.html – SLaks

+0

偉大的博客,Schabse。 – Brian

+0

如果你這樣做,因爲你實際上想要指定一個默認的返回值,那就沒問題。如果你只是這樣做,所以你不必輸入那些'<括號,參數>',那麼它不是真的(主觀上,無論如何)。 – valverij

回答

1

我經常使用這種模式來減少冗長度和支持匿名類型。

TResult Run<TQuery, TResult>(TQuery query, TResult schema = default(TResult)); 

撥打電話時,我總是命名架構參數(如schema: new { a = default(int) }),我覺得這比讓正好路過一個隨機的默認或匿名的代碼少了很多臭:通常情況下,以下我會申報方法類型。另外,通過設置一個默認的fr參數,我可以省略額外的參數,以防你想手動指定類型參數(當匿名類型不參與時,你可能有時需要這樣做)。

最重要的是,我發現我與其他開發者不太熟悉類型推斷和泛型的複雜性,並不努力閱讀或使用這些方法;他們能夠理解意圖並在自己的代碼中遵循模式。