2012-03-26 10 views
9

Immer wenn ich meinen Logger in einer Methode, z.Kann ich alle Codeanalyse-Nachrichten für eine bestimmte Klasse unterdrücken?

_logger.Debug("Connecting to database..."); 

Ich erhalte die Warnung:

CA1303 : Microsoft.Globalization: 
Method 'Database.Connect()' passes a literal 
string as parameter 'message' of a call to 'ILogger.Debug(string)'. 
Retrieve the following string(s) from a resource table instead: 
"Connecting to database...". 

Gibt es eine Möglichkeit, diese Warnung jedes Mal, wenn ich eine Funktion von ILogger verwenden zu unterdrücken? Ich möchte es wirklich nicht bei jeder Methode unterdrücken, die ich benutze.

+0

Oder Sie die Zeichenfolge aus einer Ressourcentabelle stattdessen bekommen konnte, und dann werden Sie keine Warnungen mehr haben? – Msonic

+0

Ich weiß, aber ich möchte das nicht für Protokollnachrichten tun. – xsl

+0

Präfix die Zeichenfolge mit @, um es als Literal, .Debug (@ "Verbindung mit der Datenbank ...") –

Antwort

3

Weder die FxCop/VS-Code-Analyse noch die CA1303-Regel können so konfiguriert werden, dass bestimmte Ziele ignoriert werden. Sie haben grundsätzlich drei Möglichkeiten:

  1. die Verletzungen einzeln unterdrücken,
  2. die Regel deaktivieren oder
  3. Ersatz einer benutzerdefinierten Regel, die die Art und Weise verhält, würden Sie es vorziehen.

ich auf 3 # anlehnen neigen dazu, für diese Art der Sache, aber ymmv ... Auch, wenn Sie dringend, dass Sie das Gefühl, sollte in der Lage sein, das CA1303 Verhalten zu kontrollieren, ist dies etwas, bei https://connect.microsoft.com/VisualStudio anfordernden zu betrachten oder http://visualstudio.uservoice.com/forums/121579-visual-studio.

1

Wenn Sie das GeneratedCode-Attribut auf eine Klasse anwenden, analysiert Code Analysis Ihre Klasse nicht.

3

Ich stieß auf dieses Problem und stellte fest, dass die einfachste Lösung darin bestand, den Parameter meiner Protokollierungsmethode von "message" in etwas anderes umzubenennen.

CA1303 wird nur ausgelöst, wenn der relevante Parameter oder Eigenschaftenname "Text", "Nachricht" oder "Caption" enthält. Wenn der Parameter an Console.Write oder übergeben wird, kann der Parameter auch nicht als "Wert" oder "Format" bezeichnet werden.

+0

Vielen Dank. Während ich denke, die richtige Lösung ist die Verwendung von '[Localizable (false)]', steht System.ComponentModel.LocalizableAttribute leider nicht in Portable Class Libraries zur Verfügung. Also habe ich den Parameternamen von 'message' in' logMsg' geändert (dann musste ich nur CA1704: IdentifiersShouldBeSpelledCorrectly in der Log-Schnittstelle unterdrücken). – hlovdal

13

Wenn Sie die Schnittstelle ILogger steuern, können Sie das Attribut Localizable mit dem Wert false verwenden, um anzuzeigen, dass der Wert nicht lokalisierbar ist.

Zum Beispiel:

void Info([Localizable(false)] string message); 
+1

Genau was benötigt wurde. Sollte als Antwort markiert sein. –

Verwandte Themen