9

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

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?

谢谢,

PS请抑制提醒我单个文件中的多个命名空间表明不良编程习惯的冲动...

编辑(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 错误报告,该报告建议该SourceFileList标签不能在高于项目级别的级别上使用。

考虑到这些信息,我尝试Settings.StyleCop在项目级别添加一个文件。

仍然没有喜悦。

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

编辑(20130425):

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

4

4 回答 4

9

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

[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

于 2013-10-24T23:16:02.427 回答
3

您需要在设置文件中创建一个文件列表

从文档中:

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>
于 2012-11-22T20:35:06.683 回答
1

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

弹出窗口将打开,您可以在其中自定义警告并选择要禁止的内容。在您的情况下,可以在维护性规则\文件内容中找到交战 SA1403

于 2015-12-02T13:12:41.963 回答
0

如果这是针对生成的文件,您只需在项目属性下的代码分析部分中选中“抑制生成代码的结果”框在此处输入图像描述

于 2020-02-25T12:26:58.473 回答