2012-03-26 20 views
9

Cada vez que llamo a mi registrador en un método, p.¿Puedo suprimir todos los mensajes de análisis de código para cierta clase?

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

me sale la advertencia:

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...". 

¿Hay una manera de suprimir esta advertencia cada vez que utilizo una función de ILogger? Realmente no quiero suprimirlo en cada método que lo estoy usando.

+0

O, usted podría obtener la cadena a partir de una tabla de recursos en lugar y entonces no tendrá ninguna advertencia más? – Msonic

+0

Lo sé, pero no quiero hacer eso para los mensajes de registro. – xsl

+0

Prefijo la cadena con @ para marcarla como literal, .Debug (@ "Conectando a la base de datos ...") –

Respuesta

3

Ni FxCop/VS Code Analysis ni la regla CA1303 son configurables para ignorar objetivos particulares de esta manera. Es, básicamente, tiene tres opciones:

  1. suprimir el violaciónes de forma individual,
  2. desactivar la regla, o
  3. Sustituto una regla personalizada que se comporta de la manera que prefiera.

que tienden a inclinarse hacia el # 3 para este tipo de cosas, pero tu caso es distinto ... Además, si usted se siente fuertemente que usted debe ser capaz de controlar el comportamiento CA1303, esto es algo que considere solicitar al https://connect.microsoft.com/VisualStudio o http://visualstudio.uservoice.com/forums/121579-visual-studio.

1

Si aplica el atributo GeneratedCode a una clase, Code Analysis no analizará su clase.

3

Me encontré con este problema y encontré que la solución más fácil era cambiar el nombre del parámetro de mi método de registro de "mensaje" a otra cosa.

CA1303 se activará solo si el parámetro o nombre de propiedad relevante contiene "Texto", "Mensaje" o "Título". Si el parámetro se pasa a Console.Write o Console.WriteLine, el parámetro tampoco se puede llamar "valor" o "formato".

+0

Gracias. Si bien creo que la solución adecuada es usar '[Localizable (falso)]', System.ComponentModel.LocalizableAttribute lamentablemente no está disponible en Portable Class Libraries. Entonces, para mí, cambiar el nombre del parámetro de 'mensaje' a' logMsg' lo resolvió (entonces solo tuve que suprimir CA1704: IdentifiersShouldBeSpelledCorrectly en la interfaz de registro). – hlovdal

13

Si controla la interfaz ILogger, puede aprovechar el atributo Localizable con un valor de falso para indicar que el valor no es localizable.

Por ejemplo:

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

Exactamente lo que se necesitaba. Debería haber sido marcado como una respuesta. –

Cuestiones relacionadas