我该如何取消 StyleCop 警告 SA1403?

9

考虑以下代码,它包含在单个文件中:

namespace Foo
{
    public partial class One
    {
    }
}

namespace Baa
{
    public partial class Two
    {
    }
}

编译此代码会产生两个StyleCop警告:

  • SA1402:文件只能包含一个类
  • SA1403:文件只能包含一个命名空间

抑制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): 根据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标签是否压制了其他所有设置文件。这似乎很合理,但如果是这样的话,我看到的行为将意味着在使用StyleCopOverrideSettingsFile的构建中无法使用SourceFileList。或者,Settings.StyleCop可能是错误的文件名,或者我将其放错位置了(我把它放在csproj文件旁边)。
编辑(20130425):
最终我放弃了。相关代码是由Visual Studio模板文件(.TT)自动生成的,所以我花了额外的功夫让模板代码将命名空间拆分成单独的文件。

在单个文件中使用多个命名空间可以展示代码的灵活性,但是如果你忽略StyleCop的警告并且继续这么做,那么你就违背了它的用途。StyleCop的作用在于帮助你避免不良实践。 - Mathew Thompson
4个回答

9
您需要设置抑制的范围。在这种情况下,请使用“module”。
[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

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>

有趣,我不知道这个。 - Daniel Lidström

1
我发现了更简单的方法来做到这一点,也许可以帮助某些人。您可以右键单击您的项目,然后选择StyleCop Settings。弹出窗口将打开,在那里您可以自定义警告并选择要抑制的内容。在您的情况下,警告SA1403可以在可维护性规则\文件内容中找到。

0

如果这是用于生成文件的话,您只需要在项目属性的代码分析部分中勾选“抑制生成代码的结果”复选框enter image description here即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接