Подтвердить что ты не робот

Альтернатива вложенному типу типа Expression <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 сообщает мне, что я не должен использовать Nested Type в следующем сообщении:

CA1006: Microsoft.Design: рассмотрим дизайн, где "ServiceManager.CallService < TService, Результат > (TService, Выражение < Func < TService, TResult → ) ' не гнездится родовой тип" Выражение < Func < TService, TResult > ".

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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