Альтернатива вложенному типу типа Expression <Func <T>> - PullRequest
20 голосов
/ 09 августа 2010

У меня есть функция, используемая при вызове службы.Прежде чем вызвать службу, она создаст запись в журнале:

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

Анализатор кода Visual Studio 2010 сообщает, что мне не следует использовать вложенный тип в следующем сообщении:

CA1006: Microsoft.Design: рассмотрим проект, в котором 'ServiceManager.CallService(Сервис, Экспрессия>) Выражение «не вкладывает универсальный тип»> '.

Хотя я мог бы просто создать правило подавления для этой записи, существует ли альтернатива, которая бы препятствовала отображению такого предупреждения?

Ответы [ 4 ]

26 голосов
/ 09 августа 2010

Я бы подавил это в этом случае, так как вызывающему не нужно справляться с вложенными обобщениями, он просто передает лямбда-выражение, которое легко использовать.сделать исключения для лямбда-выражений.Иногда лучше подавить это, чем писать странный код.

6 голосов
/ 09 августа 2010

Я буду честен, подавляю это правило большую часть времени. Хотя я могу понять, что некоторых из конструкции вложенных типов можно избежать, это чаще всего бывает; Вы обычно хотите оставить это на сайте вызовов, потому что не можете гарантировать, что сайт вызовов захочет, чтобы вложенный универсальный тип создавался таким же образом.

Это одно из тех правил, которые я нахожу немного властными; Я в целом согласен с большинством из них, но не с этим.

2 голосов
/ 29 сентября 2011

Такие методы, как ваш, широко используются в Linq, например:

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

Альтернативой может быть объявление типа делегата вместо вложенного Func<TService, TResult>, но это также может сбить с толку более опытного разработчика, который привык работать с деревьями выражений.

Microsoft, очевидно, делает исключение из CA1006 для вложенных универсальных типов выражений, и мы тоже должны это делать.

0 голосов
/ 09 августа 2010

Вы можете подавить предупреждение о сообщении с помощью SuppressMessageAttribute .

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