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

Скажем, у меня есть перечисление всех валют:

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