考虑此代码,它包含在一个文件中:
namespace Foo
{
public partial class One
{
}
}
namespace Baa
{
public partial class Two
{
}
}
编译此代码会导致两个StyleCop警告:
抑制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
标签是否正在取消其他所有设置文件的可能性。这似乎是合乎逻辑的,但如果是这样,我所看到的行为将暗示不可能在也使用SourceFileList
的内部版本中使用StyleCopOverrideSettingsFile
。另外,可能是Settings.StyleCop
是错误的文件名,或者我将其放置在错误的位置(我将其放在csproj文件旁边。)
编辑(20130425):
最终我放弃了。有问题的代码是由Visual Studio模板文件(.TT)自动生成的,因此,我付出了额外的努力,以使模板代码将名称空间分成单独的文件。
考虑此代码,该代码包含在一个文件中:命名空间Foo {公共局部类一个{}}命名空间Baa {公共局部类两个{}}编译此...
您需要设置抑制范围。在这种情况下,请使用“模块”。
您将要在设置文件中创建一个File List。
我发现了更简单的方法,也许可以帮助某人。您可以右键单击您的项目,然后选择StyleCop Settings。