web-dev-qa-db-fra.com

Comment supprimer les messages d'analyse de code pour tous les membres de type?

Disons que j'ai une énumération de toutes les devises:

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,

    ...
}

L'analyse de code VS 2015 continue de se plaindre d'environ 100 violations de CA1709 pour chaque membre individuel.

C'est une règle utile en soi, et je ne veux pas la désactiver; cependant, cela n'aide pas beaucoup dans ce cas précis, car CurrencyType est public et est utilisé dans de nombreux autres projets.

Je peux supprimer le message; cependant, VS me propose seulement de le supprimer pour chaque membre individuel - ce qui signifie que j'aurai 100 lignes [SuppressMessage(...)], ce qui encombrera le code.

Existe-t-il un moyen de supprimer tous les CA1709 pour tous les membres CurrencyType, sans les supprimer pour tous les autres codes de ce projet, sans avoir à écrire 100 [SuppressMessage(...)]?

Il existe un paramètre Scope de SuppressMessageAttribute, mais la documentation n'est pas claire à ce sujet. J'ai essayé de placer les deux

[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "type", Justification = "Currency codes are defined in ISO standard.")]

et

[SuppressMessage("Microsoft.Naming", "CA1709:IdentifiersShouldBeCasedCorrectly", Scope = "member", Justification = "Currency codes are defined in ISO standard.")]

sur CurrencyType lui-même. Cela ne fonctionne pas non plus.

16
penartur

Il n'y a aucun moyen de supprimer une règle pour une classe entière ou une énumération dans ce cas et de faire appliquer la suppression à tous ses membres, malheureusement.

Mais ce que vous pouvez faire, c'est créer un CodeAnalaysisDictionary.xml, ajoutez-le à votre projet contenant l'énumération et définissez sa propriété "Build action" sur CodeAnalysisDictionary:

enter image description here

Une fois que vous avez configuré cela, vous pouvez ajouter les abréviations et les exceptions de cas au dictionnaire comme ceci:

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

Bien que ces exceptions s'appliquent à tout élément du code contenant ces acronymes, elles empêcheront les avertissements CA1709 de s'afficher.

Consultez la documentation pour plus d'informations sur les exceptions que vous pouvez configurer à l'aide des fichiers de dictionnaire:

10
jessehouwing

Non, il n'y a aucun moyen de le faire sans suppressions individuelles. L'argument Scope permet au moteur d'analyse de code de savoir quel genre de chose représente l'argument Target. Par exemple, si la cible est "A.B.C", cela fait-il référence à un espace de noms nommé A.B.C ou une classe nommée C dans l'espace de noms A.B? "Scope" aurait peut-être été mieux représenté par un nom comme "TargetKind", mais cela, malheureusement, ne change pas ce qu'il représente réellement.

Étant donné la laideur des suppressions dans ce cas, vous souhaiterez peut-être les générer dans GlobalSuppressions.cs, puis les déplacer dans un fichier séparé comme CurrencyTypeMemberNameSuppressions.cs, que vous pourriez (éventuellement) imbriquer en tant que fichier sous le fichier contenant votre CurrencyType enum dans la structure de votre projet dans Visual Studio. Pas idéal, mais peut-être le meilleur choix d'un mauvais lot à ce stade ...

Voir aussi cette réponse .

6
Nicole Calinoiu

qu'en est-il de #pragma warning disable CA1709? pour réactiver, vous pouvez utiliser #pragma warning restore CA1709 mais si cette énumération est le seul type dans votre fichier, vous pouvez l'omettre.

2
Dr.Gee