考虑以下代码,它包含在单个文件中:
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)自动生成的,所以我花了额外的功夫让模板代码将命名空间拆分成单独的文件。