C# 类型表达式的嵌套类型的替代项<;Func<;T>&燃气轮机;

C# 类型表达式的嵌套类型的替代项<;Func<;T>&燃气轮机;,c#,types,nested,code-analysis,C#,Types,Nested,Code Analysis,我在调用服务时使用了一个函数。在调用服务之前,它将创建一个日志条目: protected TResult CallService<TService, TResult>(TService service, Expression<Func<TService, TResult>> functionSelector) { Logger.LogServiceCall(service, functionSelector); return funct

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

protected TResult CallService<TService, TResult>(TService service,
    Expression<Func<TService, TResult>> functionSelector)
{
    Logger.LogServiceCall(service, functionSelector);
    return functionSelector.Compile()(service);
}
protected TResult CallService(t服务服务、,
表达式(函数选择器)
{
Logger.LogServiceCall(服务、函数选择器);
返回functionSelector.Compile()(服务);
}
Visual Studio 2010代码分析器通知我不应在以下消息中使用嵌套类型:

< P> CA1006:微软。设计:考虑A 设计在哪里 'ServiceManager.CallService(TService, 表达式)' 不嵌套泛型类型 “表达”


虽然我可以简单地为这个条目创建一个抑制规则,但有没有其他方法可以阻止显示这样的警告?

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


CA不为lambda表达式设置例外。有时候抑制它比编写奇怪的代码要好。

老实说,我大部分时间都抑制它。虽然我可以理解一些嵌套类型的构造是可以避免的,但情况往往是这样的;您通常希望将其留给调用站点,因为您不能保证调用站点希望以相同的方式实例化嵌套的泛型类型


这是我觉得有点霸道的规则之一;我大体上同意他们中的大多数,但不是这一条。

您可以使用“警告”抑制消息

[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Design”,“CA1006:”)]

受保护的TResult CallService像您这样的方法在Linq中广泛使用,例如:

public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, 
    Expression<Func<TSource, bool>> predicate)
公共静态IQueryable其中(此IQueryable源,
表达式(谓词)
另一种方法是声明一个委托类型来替换嵌套的
Func
,但这很可能会让习惯于使用表达式树的更有经验的开发人员感到困惑


对于嵌套的泛型表达式类型,微软显然对CA1006例外,我们也应该例外

我完全知道,我在寻找另一种选择。代码分析的目标不是抑制一切,而是最终学习更好的方法。
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, 
    Expression<Func<TSource, bool>> predicate)