如何抑制StyleCop警告SA1403?

Mon*_*nes 9 c# stylecop

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

namespace Foo
{
    public partial class One
    {
    }
}

namespace Baa
{
    public partial class Two
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

编译此代码会产生两个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
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我似乎无法抑制SA1403.

我在每个类上面尝试了以下抑制(根据SA1402抑制):

[SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]
Run Code Online (Sandbox Code Playgroud)

我还尝试了以下装配级别抑制,无论是在文件的顶部还是在我的全局抑制文件中(我意识到这不是一个明智的想法):

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1403:FileMayOnlyContainASingleNamespace")]
Run Code Online (Sandbox Code Playgroud)

但无济于事.

所以,我的问题是:如何抑制StyleCop警告SA1403?

谢谢,

Ë

PS请压抑提醒我单个文件中的多个命名空间表示编程错误的冲动......

EDIT(20121127):根据Mightymuke的回答,我研究了使用a的可能性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>
Run Code Online (Sandbox Code Playgroud)

这也不起作用.

我相信,这可能是设计上的.我发现了一个StyleCop错误报告,建议SourceFileList标签不能在高于项目级别的级别使用.

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

仍然没有快乐.

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

编辑(20130425):

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

小智 9

您需要设置抑制的范围.在这种情况下,请使用"模块".

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

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


Mig*_*uke 3

您将需要在设置文件中创建文件列表。

\n\n

从文档中:

\n\n
Now consider a situation where you\xe2\x80\x99d like to disable some additional rules for a\ncouple of specific files in the project, Class3.cs and Class4.cs. In StyleCop\n4.4, this can be accomplished by adding a <SourceFileList> section within the\nsettings file:\n
Run Code Online (Sandbox Code Playgroud)\n\n
<SourceFileList>\n  <SourceFile>Class3.cs</SourceFile>\n  <SourceFile>Class4.cs</SourceFile>\n  <Settings>\n    <Analyzers>\n      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">\n        <Rules>\n          <Rule Name="AccessModifierMustBeDeclared">\n            <RuleSettings>\n              <BooleanProperty Name="Enabled">False</BooleanProperty>\n            </RuleSettings>\n          </Rule>\n        </Rules>\n      </Analyzer>\n    </Analyzers>\n  </Settings>\n</SourceFileList>\n
Run Code Online (Sandbox Code Playgroud)\n\n

在您的具体情况下,它应该类似于:

\n\n
<SourceFileList>\n  <SourceFile>YourFile.cs</SourceFile>\n  <Settings>\n    <Analyzers>\n      <Analyzer AnalyzerId="Microsoft.StyleCop.CSharp.MaintainabilityRules">\n        <Rules>\n          <Rule Name="FileMayOnlyContainASingleClass">\n            <RuleSettings>\n              <BooleanProperty Name="Enabled">False</BooleanProperty>\n            </RuleSettings>\n          </Rule>\n          <Rule Name="FileMayOnlyContainASingleNamespace">\n            <RuleSettings>\n              <BooleanProperty Name="Enabled">False</BooleanProperty>\n            </RuleSettings>\n          </Rule>\n        </Rules>\n      </Analyzer>\n    </Analyzers>\n  </Settings>\n</SourceFileList>\n
Run Code Online (Sandbox Code Playgroud)\n