考虑一下这个代码,它包含在一个文件中:
namespace Foo
{
public partial class One
{
}
}
namespace Baa
{
public partial class Two
{
}
}
Run Code Online (Sandbox Code Playgroud)
编译此代码会产生两个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
{
}
}
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
您将需要在设置文件中创建文件列表。
\n\n从文档中:
\n\nNow 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:\nRun 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>\nRun 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>\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
6561 次 |
| 最近记录: |