2010-08-09 84 views
19

我有一個函數在調用服務時使用。之前,它調用服務,它會創建一個日誌條目:替代嵌套類型的類型表達式<Func<T>>

protected TResult CallService<TService, TResult>(TService service, 
    Expression<Func<TService, TResult>> functionSelector) 
{ 
    Logger.LogServiceCall(service, functionSelector); 
    return functionSelector.Compile()(service); 
} 

的Visual Studio 2010的代碼分析器告訴我,我不應該在下面留言使用嵌套類型:

CA1006:微軟。設計:考慮 設計,其中 'ServiceManager.CallService < TService, 結果>(TService, 表達< Func鍵< TService,TResult > >)' 不嵌套通用類型 '表達式< Func < TService,TResult > >'。

雖然我可以簡單地爲這個條目創建一個抑制規則,但是有一個替代方案可以防止顯示這樣的警告嗎?

回答

25

我會在這種情況下壓制它,因爲調用者不必應付嵌套泛型,他只是傳遞一個易於使用的lambda表達式。

CA不會爲lambda表達式制定例外規定。有時候最好是壓制它,然後編寫奇怪的代碼。

6

我說實話,大部分時間我都壓制that rule。雖然我可以理解,可以避免一些嵌套類型的構建,但情況往往並非如此;您通常希望將其留給呼叫站點,因爲您無法保證呼叫站點希望以相同方式實例化嵌套泛型類型。

這是我覺得有點霸道的規則之一;我普遍同意他們中的大多數,但不是這一個。

0

您可以使用SuppressMessageAttribute來抑制消息警告。

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design","CA1006:<rule name>")] 
protected TResult CallService<...Snip... 
+2

我完全知道,我一直在尋找替代品。代碼分析的目標不是壓制一切,而是最終學習更好的方法。 – 2010-08-09 16:50:51

2

方法像你在LINQ的廣泛使用,例如:

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, 
    Expression<Func<TSource, bool>> predicate) 

另一種方法是申報委託類型來代替嵌套Func<TService, TResult>,但是這只是作爲可能會將更有經驗的開發人員曾經使用過表達式樹。

對於嵌套的泛型表達式類型,微軟顯然對CA1006做出例外,我們也應該如此。

相關問題