如何抑制所有类型成员的代码分析消息?

17

假设我有一个包含所有货币的枚举:

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违规问题。

这本身是一个有用的规则,我不想禁用它;但在这种特定情况下,它并没有太大帮助,因为是公共的,并且在许多其他项目中使用。

我可以抑制这个消息;然而,VS只提供了对每个成员抑制它的选项 - 这意味着我将有100个[SuppressMessage(...)]行,这会使代码混乱。

是否有任何方法可以抑制所有CurrencyType成员的所有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 本身上。也不起作用。

这个枚举是单独在一个文件中吗?如果是的话,你可以让Style Cop忽略这个文件。 - Scott Chamberlain
1
您可以将这些添加到代码分析字典中,以便它们被识别为大写缩写词。https://msdn.microsoft.com/zh-cn/library/bb514188.aspx - jessehouwing
@ScottChamberlain,StyleCop没有这个问题,似乎在类型上使用SuppressMessageAttribute会改变所有成员的分析行为。CA1709是集成于VS代码分析(FxCop)警告,而不是StyleCop的警告。 - penartur
3个回答

11

很遗憾,在这种情况下,无法抑制整个类或枚举的规则,并使抑制适用于其所有成员。

但您可以创建一个名为CodeAnalaysisDictionary.xml的文件,将其添加到包含该枚举的项目中,并将其“构建操作”属性设置为CodeAnalysisDictionary

enter image description here

完成此操作后,您可以像这样将缩写词和例外情况添加到字典中:

<Dictionary>
      <Acronyms>
         <CasingExceptions>
            <Acronym>AED</Acronym>
            <Acronym>AFN</Acronym>
            <Acronym>ALL</Acronym>
            <Acronym>...</Acronym>
         </CasingExceptions>
      </Acronyms>
</Dictionary>

尽管这些例外适用于代码中包含这些缩写的任何元素,但它们将阻止 CA1709 警告出现。

请参阅文档以了解您可以使用字典文件设置的异常信息:


6
不,没有办法不进行单独的抑制来完成这个。"Scope" 参数让代码分析引擎知道 "Target" 参数代表什么样的东西。例如,如果目标是 "A.B.C",那是否指的是名为 A.B.C 的命名空间,还是在命名空间 A.B 中名为 C 的类?"Scope" 可能更好地表示为一个像 "TargetKind" 这样的名称,但不幸的是,这并不改变它实际代表的内容。

考虑到在这种情况下抑制的丑陋程度,你可能希望将其生成到 GlobalSuppressions.cs 中,然后将其移动到一个单独的文件中,如 CurrencyTypeMemberNameSuppressions.cs,你可以将其嵌套在包含你的项目结构中的 CurrencyType 枚举文件下(可选)。虽然不完美,但也许是当前情况下最好的选择...

也请参见 this answer


3

关于 #pragma warning disable CA1709 呢? 要重新激活,您可以使用 #pragma warning restore CA1709,但是如果这个枚举是文件中唯一的类型,您可以省略它。


这在我的VS2017中有效。但是,在被标记为CA1707和CA1712的成员的枚举类型上使用SupressMessage对我在VS2017中也起作用(我没有指定Scope参数)。 - kornman00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接