如何抑制所有类型成员的代码分析消息?
How to suppress code analysis messages for all type members?
假设我有所有货币的枚举:
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
是 public 并且在很多其他项目中使用。
我可以抑制消息;然而,VS 只允许我为每个成员抑制它 - 这意味着我将有 100 [SuppressMessage(...)]
行,这会使代码混乱。
有什么方法可以抑制所有 CurrencyType
成员的所有 CA1709,而不抑制该项目中所有其他代码的所有 CA1709,而不必编写 100 [SuppressMessage(...)]
?
SuppressMessageAttribute
有一个 Scope
参数,但是关于那个的文档不清楚。我试过同时放置
[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
本身。两者都不起作用。
不,没有单独压制是无法做到这一点的。 Scope
参数让代码分析引擎知道 Target
参数代表什么样的东西。例如,如果 Target 是 "A.B.C",它是指命名空间 A.B.C
还是命名空间 A.B
中名为 C
的 class? "Scope" 可能用 "TargetKind" 这样的名称更好地表示,但不幸的是,这并没有改变它实际代表的内容。
考虑到在这种情况下抑制的丑陋,您可能希望将它们生成到 GlobalSuppressions.cs
中,然后将它们移动到一个单独的文件中,例如 CurrencyTypeMemberNameSuppressions.cs
,您可以(可选地)将其嵌套为Visual Studio 中项目结构中包含 CurrencyType
枚举的文件下的一个文件。不理想,但也许是此时最好的选择...
另见 this answer。
不幸的是,在这种情况下,无法抑制整个 class 或枚举的规则,也无法将抑制应用于其所有成员。
但是您可以做的是创建一个 CodeAnalaysisDictionary.xml
,将其添加到包含 Enum 的项目并将其 'Build action' 属性 设置为 CodeAnalysisDictionary
:
设置完成后,您可以像这样向词典中添加缩写和例外情况:
<Dictionary>
<Acronyms>
<CasingExceptions>
<Acronym>AED</Acronym>
<Acronym>AFN</Acronym>
<Acronym>ALL</Acronym>
<Acronym>...</Acronym>
</CasingExceptions>
</Acronyms>
</Dictionary>
虽然这些例外将适用于代码中包含这些首字母缩略词的任何元素,但它们将阻止 CA1709 警告出现。
有关可以使用字典文件设置的例外情况的详细信息,请参阅文档:
那#pragma warning disable CA1709
呢?
要重新激活,您可以使用 #pragma warning restore CA1709
,但如果此枚举是文件中唯一的一种类型,您可以将其省略。
假设我有所有货币的枚举:
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
是 public 并且在很多其他项目中使用。
我可以抑制消息;然而,VS 只允许我为每个成员抑制它 - 这意味着我将有 100 [SuppressMessage(...)]
行,这会使代码混乱。
有什么方法可以抑制所有 CurrencyType
成员的所有 CA1709,而不抑制该项目中所有其他代码的所有 CA1709,而不必编写 100 [SuppressMessage(...)]
?
SuppressMessageAttribute
有一个 Scope
参数,但是关于那个的文档不清楚。我试过同时放置
[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
本身。两者都不起作用。
不,没有单独压制是无法做到这一点的。 Scope
参数让代码分析引擎知道 Target
参数代表什么样的东西。例如,如果 Target 是 "A.B.C",它是指命名空间 A.B.C
还是命名空间 A.B
中名为 C
的 class? "Scope" 可能用 "TargetKind" 这样的名称更好地表示,但不幸的是,这并没有改变它实际代表的内容。
考虑到在这种情况下抑制的丑陋,您可能希望将它们生成到 GlobalSuppressions.cs
中,然后将它们移动到一个单独的文件中,例如 CurrencyTypeMemberNameSuppressions.cs
,您可以(可选地)将其嵌套为Visual Studio 中项目结构中包含 CurrencyType
枚举的文件下的一个文件。不理想,但也许是此时最好的选择...
另见 this answer。
不幸的是,在这种情况下,无法抑制整个 class 或枚举的规则,也无法将抑制应用于其所有成员。
但是您可以做的是创建一个 CodeAnalaysisDictionary.xml
,将其添加到包含 Enum 的项目并将其 'Build action' 属性 设置为 CodeAnalysisDictionary
:
设置完成后,您可以像这样向词典中添加缩写和例外情况:
<Dictionary>
<Acronyms>
<CasingExceptions>
<Acronym>AED</Acronym>
<Acronym>AFN</Acronym>
<Acronym>ALL</Acronym>
<Acronym>...</Acronym>
</CasingExceptions>
</Acronyms>
</Dictionary>
虽然这些例外将适用于代码中包含这些首字母缩略词的任何元素,但它们将阻止 CA1709 警告出现。
有关可以使用字典文件设置的例外情况的详细信息,请参阅文档:
那#pragma warning disable CA1709
呢?
要重新激活,您可以使用 #pragma warning restore CA1709
,但如果此枚举是文件中唯一的一种类型,您可以将其省略。