Как подавить сообщения анализа кода для всех членов типа?

Допустим, у меня есть перечисление всех валют:

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 но если это перечисление - единственный тип в вашем файле, вы можете не указывать его.

Другие вопросы по тегам