Альтернатива вложенному типу типа Expression >

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

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 (TService, Выражение >) ' не вкладывает универсальный тип «Expression >».

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

20
задан JasonMArcher 7 June 2015 в 01:42
поделиться

3 ответа

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

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

26
ответ дан 30 November 2019 в 00:19
поделиться

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

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

6
ответ дан 30 November 2019 в 00:19
поделиться

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

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design","CA1006:<rule name>")]
protected TResult CallService<...Snip...
0
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: