Как подавить предупреждение StyleCop SA1403?

Рассмотрим этот код, который содержится в одном файле:

namespace Foo
{
    public partial class One
    {
    }
}

namespace Baa
{
    public partial class Two
    {
    }
}

Компиляция этого кода приводит к появлению двух предупреждений StyleCop:

  • SA1402: FileMayOnlyContainASingleClass
  • SA1403: FileMayOnlyContainASingleNamespace

Подавление SA1402 работает как положено:

namespace Foo
{
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]
    public partial class One
    {
    }
}

namespace Baa
{
    [SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]        
    public partial class Two
    {
    }
}

К сожалению, я не могу подавить SA1403.

Я пробовал следующее подавление над каждым из классов (согласно подавлению SA1402):

[SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]

Я также пробовал следующее подавление уровня сборки, как в верхней части файла, так и в моем файле глобального подавления (я понимаю, что это неразумная идея):

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]

Но безуспешно.

Итак, мой вопрос: как подавить предупреждение StyleCop SA1403?

Спасибо,

E

P.S. Пожалуйста, подавите желание напомнить мне, что несколько пространств имен в одном файле демонстрируют плохую практику программирования ...

РЕДАКТИРОВАТЬ (20121127): В соответствии с ответом Майтумука я рассмотрел возможность использования SourceFileList.

В нашей сборке мы используем тег StyleCopOverrideSettingsFile, который указывает на общий файл правил. В соответствии с предложением Майтумука, я добавил в наш файл следующее:

  <SourceFileList>
    <SourceFile>MyFileName.cs</SourceFile>
    <Settings>
      <Analyzers>
        <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
          <Rules>
            <Rule Name="FileMayOnlyContainASingleNamespace">
              <RuleSettings>
                <BooleanProperty Name="Enabled">False</BooleanProperty>
              </RuleSettings>
            </Rule>
          </Rules>
        </Analyzer>
      </Analyzers>
    </Settings>
  </SourceFileList>

Это тоже не сработало.

Однако я считаю, что это могло быть сделано намеренно. Я нашел отчет об ошибке StyleCop, в котором говорилось, что тег SourceFileList нельзя использовать на уровне выше, чем уровень проекта. .

Помня об этой информации, я попытался добавить Settings.StyleCop файл на уровне проекта.

По-прежнему никакой радости.

Сейчас я изучаю возможность того, что тег StyleCopOverrideSettingsFile аннулирует все остальные файлы настроек. Это кажется логичным, но если это так, то поведение, которое я видел, означало бы, что невозможно использовать SourceFileList в сборке, которая также использует StyleCopOverrideSettingsFile. В качестве альтернативы, это может быть просто Settings.StyleCop - неправильное имя файла или я поместил его в неправильное место (я поместил его рядом с файлом csproj.

РЕДАКТИРОВАТЬ (20130425):

В конце концов я сдался. Рассматриваемый код был автоматически сгенерирован файлом шаблона Visual Studio (.TT), поэтому я приложил дополнительные усилия, чтобы код шаблона разделил пространства имен на отдельные файлы.


person Montgomery 'monty' Jones    schedule 22.11.2012    source источник
comment
Использование нескольких пространств имен в одном файле демонстрирует ба ...... о, вы уже сказали, что: P. Если серьезно, StyleCop поможет вам избежать плохих практик, но вы все равно хотите игнорировать его и делать это? Вы против его использования :).   -  person mattytommo    schedule 22.11.2012


Ответы (4)


Вам необходимо установить объем подавления. В этом случае используйте «модуль».

[module: System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace", Justification = "This is a generated file which generates all the necessary support classes.")]

Я узнал об этом на следующей странице в разделе «Подавления на глобальном уровне»: http://msdn.microsoft.com/en-us/library/ms244717.aspx#sectionToggle4

person Richard Brent Arthur    schedule 24.10.2013

Вам нужно создать список файлов в своем файле настроек.

Из документации:

Now consider a situation where you’d like to disable some additional rules for a
couple of specific files in the project, Class3.cs and Class4.cs. In StyleCop
4.4, this can be accomplished by adding a <SourceFileList> section within the
settings file:
<SourceFileList>
  <SourceFile>Class3.cs</SourceFile>
  <SourceFile>Class4.cs</SourceFile>
  <Settings>
    <Analyzers>
      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
        <Rules>
          <Rule Name="AccessModifierMustBeDeclared">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
        </Rules>
      </Analyzer>
    </Analyzers>
  </Settings>
</SourceFileList>

В вашем конкретном случае это должно выглядеть примерно так:

<SourceFileList>
  <SourceFile>YourFile.cs</SourceFile>
  <Settings>
    <Analyzers>
      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">
        <Rules>
          <Rule Name="FileMayOnlyContainASingleClass">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
          <Rule Name="FileMayOnlyContainASingleNamespace">
            <RuleSettings>
              <BooleanProperty Name="Enabled">False</BooleanProperty>
            </RuleSettings>
          </Rule>
        </Rules>
      </Analyzer>
    </Analyzers>
  </Settings>
</SourceFileList>
person Mightymuke    schedule 22.11.2012
comment
Интересно, я этого не знал. - person Daniel Lidström; 24.06.2013

Нашел способ попроще, может кому поможет. Вы можете щелкнуть проект правой кнопкой мыши и выбрать Настройки StyleCop.

Откроется всплывающее окно, в котором вы можете настроить предупреждения и выбрать, что вы хотите подавить. В вашем случае, враждебный SA1403 можно найти в Правилах ремонтопригодности \ Содержание файла.

person Ognjen Babic    schedule 02.12.2015

Если это для сгенерированного файла, вы можете просто установить флажок «Скрыть результаты из сгенерированного кода» в разделе «Анализ кода» в свойствах проекта введите описание изображения здесь

person Pablo Retyk    schedule 25.02.2020