替代嵌套类型的Expression <Func <T >>

Pie*_*ant 20 c# types code-analysis nested

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

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

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

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

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

Ste*_*ger 26

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

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


cas*_*One 6

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

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