У меня есть функция, используемая при вызове службы. Перед вызовом службы, он создаст запись в журнале:
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 >».
Хотя я мог бы просто создать правило подавления для этой записи, существует ли альтернатива, которая предотвратила бы отображение такого предупреждения?
В этом случае я бы подавил это по той причине, что вызывающему абоненту не нужно иметь дело с вложенными универсальными шаблонами, он просто передает лямбда-выражение, которое легко использовать.
CA не делает исключений для лямбда-выражений. Иногда лучше подавить это, чем написать странный код.
Честно говоря, я подавляю это правило большую часть времени. Хотя я могу понять, что некоторых построений вложенных типов можно избежать, это чаще всего так; вы обычно хотите оставить это сайту вызова, потому что вы не можете гарантировать, что сайт вызова захочет создать экземпляр вложенного универсального типа таким же образом.
Это одно из тех правил, которое я считаю немного властным; Я в целом согласен с большинством из них, но не с этим.
Вы можете подавить предупреждение о сообщении с помощью SuppressMessageAttribute .
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design","CA1006:<rule name>")]
protected TResult CallService<...Snip...