替代嵌套类型的Expression <Func >

我有一个调用服务时使用的函数。 在调用服务之前,它将创建一个日志条目:

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

Visual Studio 2010代码分析器通知我不应在以下消息中使用嵌套类型:

CA1006:Microsoft.Design:考虑一种设计,其中’ServiceManager.CallService (TService,Expression <Func >)’不嵌套generics类型’Expression <Func >’ 。

虽然我可以简单地为此条目创建抑制规则,但是是否存在会阻止显示此类警告的替代方法?

在这种情况下我会压制它,因为调用者不必处理嵌套generics,他只是传递一个易于使用的lambda表达式。

CA不会对lambda表达式进行例外处理。 有时最好压制它然后编写奇怪的代码。

老实说,我大多数时候都会压制这条规则 。 虽然我可以理解,可以避免嵌套类型的一些构造,但通常情况并非如此; 您通常希望将其留给调用站点,因为您无法保证调用站点希望以相同的方式实例化嵌套generics类型。

这是我发现有点霸道的规则之一; 我普遍同意他们中的大多数,但不是这个。

像你这样的方法在Linq中被广泛使用,例如:

 public static IQueryable Where(this IQueryable source, Expression> predicate) 

另一种方法是声明一个委托类型来替换嵌套的Func ,但这很可能会混淆一个曾经习惯使用表达式树的经验更丰富的开发人员。

对于嵌套通用表达式类型,Microsoft显然对CA1006例外,我们也应如此。

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

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