Как подавить сообщения анализа кода для всех членов типа?
Скажем, у меня есть перечисление всех валют:
public enum CurrencyType
{
/// <summary>
/// United Arab Emirates dirham
/// </summary>
[EnumMember]
AED = 784,
/// <summary>
/// Afghan afghani
/// </summary>
[EnumMember]
AFN = 971,
/// <summary>
/// Albanian lek
/// </summary>
[EnumMember]
ALL = 008,
...
}
Анализ кода VS 2015 продолжает жаловаться на 100 нарушений CA1709 для каждого отдельного члена.
Это полезное правило само по себе, и я не хочу его отключать; но в этом конкретном случае это не очень помогает, поскольку CurrencyType
является общедоступным и используется во многих других проектах.
Я могу подавить сообщение; однако VS предлагает только подавить его для каждого отдельного участника - это значит, что у меня будет 100 строк [SuppressMessage(...)]
, что загромождает код.
Есть ли способ подавить все CA1709 для всех членов CurrencyType
, не подавляя его для всего другого кода в этом проекте, без необходимости писать 100 [SuppressMessage(...)]
?
Существует параметр Scope
SuppressMessageAttribute
, но документация на нем неясна. Я попытался разместить оба
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "type", Justification = "Currency codes are defined in ISO standard.")]
и
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "member", Justification = "Currency codes are defined in ISO standard.")]
on CurrencyType
. Не работает.
Ответы
Ответ 1
В этом случае невозможно исключить правило для целого класса или перечисления, и к сожалению, подавление распространяется на всех его членов.
Но что вы можете сделать, создайте CodeAnalaysisDictionary.xml
, добавьте его в свой проект, содержащий Enum, и установите его "Свойство сборки" на CodeAnalysisDictionary
:
![введите описание изображения здесь]()
Как только вы установите это, вы можете добавить аббревиатуры и исключения для случая в словарь следующим образом:
<Dictionary>
<Acronyms>
<CasingExceptions>
<Acronym>AED</Acronym>
<Acronym>AFN</Acronym>
<Acronym>ALL</Acronym>
<Acronym>...</Acronym>
</CasingExceptions>
</Acronyms>
</Dictionary>
Хотя эти исключения будут применяться к любому элементу кода с этими акронимами в них, они предотвратят появление предупреждений CA1709.
Дополнительную информацию об исключениях, которые вы можете настроить с помощью файлов словарей, см. в документации:
Ответ 2
Нет, нет способа сделать это без индивидуальных подавлений. Аргумент Scope
позволяет механизму анализа кода знать, что представляет собой аргумент Target
. Например, если целью является "A.B.C", относится ли это к пространству имен с именем A.B.C
или к классу с именем C
в пространстве имен A.B
? "Scope", возможно, лучше было бы представить таким именем, как "TargetKind", но это, к сожалению, не меняет того, что на самом деле представляет.
Учитывая уродливость подавлений в этом случае, вы можете сгенерировать их в GlobalSuppressions.cs
, а затем переместить их в отдельный файл, например CurrencyTypeMemberNameSuppressions.cs
, который вы можете (необязательно) вкладывать как файл в файл, содержащий ваш CurrencyType
enum в структуре вашего проекта в Visual Studio. Не идеально, но, возможно, лучший выбор из плохих партий на данный момент...
Также смотрите этот ответ.
Ответ 3
как насчет #pragma warning disable CA1709
?
для повторной активации вы можете использовать #pragma warning restore CA1709
, но если это перечисление является единственным типом в вашем файле, вы можете не указывать его.
Ответ 4
Если ваше перечисление находится в отдельном файле, вы можете подавить сообщения на уровне класса (например, MSDN):
#define CODE_ANALYSIS
using System;
using System.Diagnostics.CodeAnalysis;
namespace CodeAnalysisSample
{
class Library
{
[SuppressMessage("Microsoft.Performance", "CA1801:ReviewUnusedParameters", MessageId = "isChecked")]
[SuppressMessage("Microsoft.Performance", "CA1804:RemoveUnusedLocals", MessageId = "fileIdentifier")]
static void FileNode(string name, bool isChecked)
{
string fileIdentifier = name;
string fileName = name;
string version = String.Empty;
}
}
}
Проверьте следующую ссылку. это должно быть полезно:
https://msdn.microsoft.com/en-us/library/system.diagnostics.codeanalysis.suppressmessageattribute(v=vs.110).aspx