如何抑制StyleCop警告SA1403?

时间:2012-11-22 17:20:33

标签: c# stylecop

考虑这段代码,它包含在一个文件中:

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?

谢谢,

电子

P.S。请压制一下,提醒我单个文件中的多个名称空间表现出错误的编程习惯......

编辑(20121127): 根据Mightymuke的回答,我研究了使用SourceFileList的可能性。

我们在构建中使用StyleCopOverrideSettingsFile标记,该标记指向共享规则文件。根据Mightymuke的建议,我在文件中添加了以下内容:

  <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 bug report表示SourceFileList标记不能在高于项目级别的级别使用。

记住这些信息时,我试图在项目级别添加Settings.StyleCop文件。

仍然没有快乐。

我现在正在研究StyleCopOverrideSettingsFile标记是否正在撤销所有其他设置文件。这似乎是合乎逻辑的,但是,如果是这样,我所看到的行为意味着在使用SourceFileList的构建中不可能使用StyleCopOverrideSettingsFile。 或者,可能只是Settings.StyleCop是错误的文件名,或者我把它放在错误的位置(我把它放在csproj文件旁边。

编辑(20130425):

最终我放弃了。有问题的代码是由visual studio模板文件(.TT)自动生成的,所以我付出了额外的努力,使模板代码将命名空间拆分成单独的文件。

4 个答案:

答案 0 :(得分:8)

您需要设置抑制的范围。在这种情况下,请使用“module”。

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

我从以下页面的“Gobal-Level Suppressions”部分了解到这一点: http://msdn.microsoft.com/en-us/library/ms244717.aspx#sectionToggle4

答案 1 :(得分:3)

您需要在设置文件中创建File List

来自文档:

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>

答案 2 :(得分:1)

我发现了更简单的方法,也许它有助于某人。 您可以右键单击您的项目并选择StyleCop Settings

弹出窗口将打开,您可以在那里自定义警告并选择要抑制的内容。在您的情况下,可以在可维护性规则\文件内容

上找到交战SA1403

答案 3 :(得分:0)

如果这是用于生成的文件,则只需在项目属性下的“代码分析”部分中选中“从生成的代码中抑制结果”框enter image description here