假设我列举了所有货币:
public enum CurrencyType
{
/// <summary>
/// United Arab Emirates dirham
/// </summary>
[EnumMember]
AED = 784,
/// <summary>
/// Afghan afghani
/// </summary>
[EnumMember]
AFN = 971,
/// <summary>
/// Albanian lek
/// </summary>
[EnumMember]
ALL = 008,
...
}
VS 2015代码分析一直抱怨每个成员都有100次违反CA1709的行为。
这本身就是一个有用的规则,我不想禁用它;然而,在这个特定情况下,它没有多大帮助,因为CurrencyType
是公开的,并且在很多其他项目中使用。
我可以压制这个消息;然而,VS只允许我为每个成员压制它 - 这意味着我将拥有100条[SuppressMessage(...)]
线,这将使代码混乱。
有没有办法压制所有CurrencyType
成员的所有CA1709,而不是为这个项目中的所有其他代码抑制它,而不必写100 [SuppressMessage(...)]
?
有一个Scope
的SuppressMessageAttribute
参数,但文档不清楚。我试过放两个
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "type", Justification = "Currency codes are defined in ISO standard.")]
和
[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "member", Justification = "Currency codes are defined in ISO standard.")]
在CurrencyType
本身。也没有用。
在这种情况下,无法抑制整个类或枚举的规则,并且不幸的是,抑制适用于其所有成员。
但你可以做的是创建一个CodeAnalaysisDictionary.xml
,将它添加到包含Enum的项目中,并将其“Build action”设置为CodeAnalysisDictionary
:
设置完成后,可以将缩写和大小写例外添加到字典中,如下所示:
<Dictionary>
<Acronyms>
<CasingExceptions>
<Acronym>AED</Acronym>
<Acronym>AFN</Acronym>
<Acronym>ALL</Acronym>
<Acronym>...</Acronym>
</CasingExceptions>
</Acronyms>
</Dictionary>
虽然这些异常将适用于代码中包含这些首字母缩略词的任何元素,但它们会阻止CA1709警告显示。
有关可以使用字典文件设置的例外的更多信息,请参阅文档:
不,没有个别抑制就没有办法做到这一点。 Scope
参数让代码分析引擎知道Target
参数代表什么样的东西。例如,如果Target是“A.B.C”,那么它是否在命名空间A.B.C
中引用名为C
的命名空间或名为A.B
的类? “范围”可能更好地用“TargetKind”之类的名称来表示,但不幸的是,它并没有改变它实际代表的内容。
鉴于在这种情况下抑制的丑陋,你可能想要将它们生成到GlobalSuppressions.cs
,然后将它们移动到一个单独的文件,如CurrencyTypeMemberNameSuppressions.cs
,你可以(可选地)作为文件嵌套在包含你的项目结构中的CurrencyType
枚举的文件下在Visual Studio中。不理想,但也许是目前最糟糕的选择......
另见this answer。