2017-09-02 11 views
1

J'ai une classe qui commence quelque chose comme ceci:Ne peut pas supprimer CA1502

namespace Tools.Builders 
{ 
    internal abstract class Builder 
    { 
     [SuppressMessage("Microsoft.Maintainability", "CA1502")] 
     private static readonly Dictionary<string, Func<ILogger, Builder>> _builders = 
      new Dictionary<string, Func<ILogger, Builder>> 
     { 
      { "1", (x) => {return new BuilderType1(x);} }, 
      { "2", (x) => {return new BuilderType2(x);} }, 
      { "3", (x) => {return new BuilderType3(x);} }, 
      { "4", (x) => {return new BuilderType4(x);} }, 
      { "5", (x) => {return new BuilderType5(x);} }, 
      { "6", (x) => {return new BuilderType6(x);} }, 
      { "7", (x) => {return new BuilderType7(x);} }, 
      { "8", (x) => {return new BuilderType8(x);} }, 
      { "9", (x) => {return new BuilderType9(x);} }, 
     }; 
     protected ILogger _logger; 
     protected Builder(ILogger logger) 
     { 
      _logger = logger; 
     } 
     //... 

Cela provoque un avertissement de CA1502 de la forme « Builder.Builder() a une complexité cyclomatique de ... » (ce qui est un problème connu avec ce type d'initialiseur). Cependant, mon problème est que je ne peux pas supprimer l'avertissement. J'ai essayé de placer le SuppressMessageAttribute dans toutes sortes d'endroits différents dans le code, mais il est simplement ignoré. Des suggestions quelqu'un?

+0

[Docs] (https://msdn.microsoft.com/fr-fr/library/system.diagnostics.codeanalysis.suppressmessageattribute.suppressmessageattribute (v = vs.110) .aspx): _ "Le symbole du préprocesseur" CODE_ANALYSIS "doit être défini pour que cet attribut soit effectif.L'absence du symbole du préprocesseur entraîne l'application de l'attribut." _ – CodeCaster

+0

Eh bien, je l'ai essayé, mais cela n'a pas fait de différence. Merci quand même. – Dave

+0

Voir [Pragma ne fonctionne pas pour l'avertissement CA1502] (https://social.msdn.microsoft.com/Forums/en-US/872d9c97-02b7-4409-9df7-6202ea0820dc/pragma-not-working-for-warning-ca1502 ? forum = vstscode) – buffjape

Répondre

1

j'ai pu supprimer ce message en utilisant un attribut de niveau assembly qui spécifie le constructeur comme cible:

using System.Diagnostics.CodeAnalysis; 

[assembly: SuppressMessage("Microsoft.Maintainability", 
          "CA1502:AvoidExcessiveComplexity", 
          Scope = "member", 
          Target = "Tools.Builders.Builder.#.cctor()")] 

Cet attribut peut être placé dans n'importe quel fichier de code de l'assembly. Pour référence ultérieure, j'ai généré cet attribut en cliquant avec le bouton droit sur l'avertissement CA dans la fenêtre Liste d'erreurs (ou la fenêtre Analyse de code dans VS2013 et versions antérieures) et en sélectionnant Supprimer -> En fichier de suppression.

+0

C'est un truc génial. Copiez l'attribut hors de GlobalSuppressions.cs, qui peut ensuite être supprimé - beaucoup plus net pour l'avoir dans la source à laquelle il s'applique. Cela a résolu mon problème, merci. (BTW vous vouliez dire la fenêtre d'analyse de code pas la fenêtre de liste d'erreur) – Dave

+0

@Dave A partir de VS2015 ils ont combiné ces fenêtres - je vais éditer pour noter la différence. –

-1

Application de l'attribut suivant à la méthode en question a fonctionné pour moi dans VS 2017

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]

+0

C'est ce que j'ai déjà essayé - μS doit l'avoir corrigé en 2017 (je suis sur 2012) – Dave