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