Подавить CA1305 для DebugFormat InfoFormat и аналогичных вызовов - PullRequest
1 голос
/ 16 июня 2011

Я использую Common.Logging для .NET . Когда я использую одну из функций XXXFormat, такую ​​как DebugFormat или InfoFormat, я получаю предупреждение CA1305 . Это достаточно просто подавить, щелкнув правой кнопкой мыши и сказав подавить в коде или добавить в файл подавлений проекта. Я хотел бы добавить одну строку в GlobalSuppressions.cs, чтобы подавить все вхождения этого предупреждения для всех вызовов DebugFormat (и отдельных строк для InfoFormat, TraceFormat и т. Д.). Пока я не могу понять, как это сделать. Когда я щелкаю правой кнопкой мыши предупреждение и выбираю Подавить сообщение -> В файле Подавления проекта, вот что добавляется:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "Common.Logging.ILog.DebugFormat(System.String,System.Object[])", Scope = "member", Target = "My.Full.Namespace.Class.#MyFunctionName(int)")]

Как видите, подавление создало атрибут уровня сборки для подавления сообщения. Внутри самого атрибута для Scope установлено значение "member", а для Target - сигнатура метода точечного имени класса с указанием пространства имен. Это действительно подавляет сообщение для вызовов DebugFormat в этой функции, но я хочу подавить сообщение для всех вызовов DebugFormat. Я попытался удалить Target и изменить Scope на «module» (и «assembly» - не уверен, если это допустимо), но я все еще не могу отключить это предупреждение для всех вхождений DebugFormat.

В идеале я хочу создать файл GlobalSuppressions.cs, в котором есть хотя бы следующие записи (или аналогичные):

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "Common.Logging.ILog.TraceFormat(System.String,System.Object[])", Scope = "module",)] 
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "Common.Logging.ILog.DebugFormat(System.String,System.Object[])", Scope = "module",)] 
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "Common.Logging.ILog.InfoFormat(System.String,System.Object[])", Scope = "module",)] 
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "Common.Logging.ILog.WarnFormat(System.String,System.Object[])", Scope = "module",)] 
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "Common.Logging.ILog.ErrorFormat(System.String,System.Object[])", Scope = "module",)] 
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1305:SpecifyIFormatProvider", MessageId = "Common.Logging.ILog.FatalFormat(System.String,System.Object[])", Scope = "module",)] 

Кто-нибудь знает, как это сделать?

Спасибо.

1 Ответ

2 голосов
/ 16 июня 2011

К сожалению, подобные иерархические подавления не поддерживаются в существующих версиях FxCop. Каждому экземпляру нарушения правила требуется соответствующий экземпляр SuppressMessageAttribute. Если вы не хотите использовать правило, отключите его. Если вы не хотите, чтобы он применялся к определенным методам, у вас есть три варианта:

  1. Добавить подавление для каждого нарушения,
  2. Замените правило на пользовательское правило, которое игнорирует методы, которые вы хотите игнорировать, или
  3. Вместо непосредственного вызова этих методов измените код так, чтобы он вызывал методы фасада, которые применяют правильную культуру.

Лично я бы выбрал №3, но мммм ...

...