2015-09-02 6 views
4

Скажем, у меня есть перечисление всех валют:Как подавить сообщения анализа кода для всех членов типа?

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(...)]?

Параметр ScopeSuppressMessageAttribute, но документация на нем неясна. Я попытался размещения как

[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. Не работает.

+0

Является ли это перечисление в файле само по себе? Если это так, вы можете иметь стиль Cop [игнорировать файл] (http://sethflowers.com/blog/force-stylecop-to-ignore-a-file/) –

+1

Вы можете добавить их в словарь анализа кода, признанные как капитализированные сокращения. https://msdn.microsoft.com/en-us/library/bb514188.aspx – jessehouwing

+0

@ScottChamberlain Нет такой проблемы с StyleCop, кажется, что 'SuppressMessageAttribute' на типе меняет поведение анализа для всех членов. CA1709 - это встроенное предупреждение VS Code Analysis (FxCop), а не StyleCop. – penartur

ответ

4

В этом случае невозможно исключить правило для всего класса или перечисления, и к сожалению, подавление распространяется на всех его членов.

Но что вы можете сделать, это создать CodeAnalaysisDictionary.xml, добавьте его в свой проект, содержащий Enum и настройки его «Построить действие» Собственость к CodeAnalysisDictionary:

enter image description here

После того, как вы установили это вверх, вы можете добавить сокращения и исключения случая к словарю, как это:

<Dictionary> 
     <Acronyms> 
     <CasingExceptions> 
      <Acronym>AED</Acronym> 
      <Acronym>AFN</Acronym> 
      <Acronym>ALL</Acronym> 
      <Acronym>...</Acronym> 
     </CasingExceptions> 
     </Acronyms> 
</Dictionary> 

Хотя эти исключения будут применяться к любому элементу в коде с этими аббревиатурами в них, они будут предварительно отключите предупреждения CA1709.

Смотрите документацию для получения дополнительной информации об исключениях вы можете установить с помощью словарей:

4

Нет, нет никакого способа сделать это без индивидуальных подавлений. Аргумент Scope позволяет механизму анализа кода знать, что представляет собой аргумент Target. Например, если Target является «A.B.C», ссылается ли это на пространство имен с именем A.B.C или класс с именем C в пространстве имен A.B? «Область», возможно, была бы лучше представлена ​​таким именем, как «TargetKind», но это, к сожалению, не меняет того, что оно на самом деле представляет.

Учитывая уродство из подавленных в этом случае, вы можете создавать их в GlobalSuppressions.cs, а затем переместить их в отдельный файл, как CurrencyTypeMemberNameSuppressions.cs, который вы могли бы (при необходимости) гнезда в виде файла под файл, содержащий ваше CurrencyType перечисления в вашей структуре проекта в Visual Studio. Не идеально, но, возможно, лучший выбор плохой много в этой точке ...

-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

+0

Определить действительно не нужно. Нет причин, по которым атрибуты должны быть скомпилированы в вашу окончательную DLL. –

+0

Пример вашего кода совершенно не имеет значения, поскольку он связан с подавлением сообщений для кода внутри данного метода, в то время как мне нужно подавлять сообщения для членов внутри данного типа. Кроме того, как я уже упоминал, я попытался использовать 'SuppressMessageAttribute' в моем перечислении безрезультатно; и вопрос в том, как точно аннотировать мое перечисление с помощью 'SuppressMessage', чтобы он подавлял сообщения для всех его членов. Я также упомянул, что мне не удалось найти эту информацию в документации, поэтому ваша общая ссылка определенно не поможет. – penartur

+0

@ScottChamberlain, требование, чтобы «ваше перечисление было в отдельном файле» также не нужно. Не говоря уже о том, что остальная часть ответа на самом деле не связана с вопросом. – penartur