Как подавить сообщения анализа кода для всех членов типа?
Допустим, у меня есть перечисление всех валют:
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(...)]
?
E сть 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.")]
на CurrencyType
сам. Ни один не работает.
2 ответа
В этом случае нет способа подавить правило для целого класса или перечисления, и, к сожалению, подавление применяется ко всем его членам.
Но что вы можете сделать, это создать CodeAnalaysisDictionary.xml
добавьте его в свой проект, содержащий Enum, и установите для свойства "Build action" значение CodeAnalysisDictionary
:
После того, как вы это настроите, вы можете добавить в словарь аббревиатуры и исключения падежей следующим образом:
<Dictionary>
<Acronyms>
<CasingExceptions>
<Acronym>AED</Acronym>
<Acronym>AFN</Acronym>
<Acronym>ALL</Acronym>
<Acronym>...</Acronym>
</CasingExceptions>
</Acronyms>
</Dictionary>
Хотя эти исключения будут применяться к любому элементу кода с этими сокращениями, они будут препятствовать отображению предупреждений CA1709.
См. Документацию для получения дополнительной информации об исключениях, которые вы можете настроить, используя файлы словаря:
Нет, нет способа сделать это без индивидуальных подавлений. Scope
Аргумент позволяет механизму анализа кода знать, что за вещь Target
аргумент представляет. Например, если целью является "ABC", относится ли это к пространству имен с именем A.B.C
или класс с именем C
в пространстве имен A.B
? "Scope", возможно, был бы лучше представлен таким именем, как "TargetKind", но это, к сожалению, не меняет того, что он на самом деле представляет.
Учитывая уродство подавлений в этом случае, вы можете сгенерировать их в GlobalSuppressions.cs
затем переместите их в отдельный файл, например CurrencyTypeMemberNameSuppressions.cs
, который вы можете (необязательно) вложить в файл под файлом, содержащим CurrencyType
Перечислите структуру вашего проекта в Visual Studio. Не идеально, но, возможно, лучший выбор из плохих партий на данный момент...
Также смотрите этот ответ.
Как насчет #pragma warning disable CA1709
? для реактивации вы можете использовать#pragma warning restore CA1709
но если это перечисление - единственный тип в вашем файле, вы можете не указывать его.