2012-08-23 11 views
23

Me gusta cómo String.Format utiliza argumentos para insertar variables en la cadena que está formateando. Esto se llama Formateo compuesto y se trata en MSDN here.¿Cómo puedo hacer mi propio método similar a String.Format utilizando formato compuesto en C#

quiero esta funcionalidad con mi fachada de registro:

string foo = "fancy"; 
string bar = "message"; 
log.Debug("My {0} log {1}.", foo, bar) 

Mi ILoggerFacade tiene el siguiente método de firma:

void Debug<T>(T message, params Object[] args); 

Y, sé que puedo poner en práctica esta sencillamente:

ILog m_Log = \\some logging implementation 
public void Debug<T>(T message, params Object[] args) 
{ 
    m_Log.Debug(String.Format(message, args)); 
} 

Sin embargo, en Visual Studio no obtengo el destacado resaltado de {0}, {1}, ... ar argu-:

Argument highlighting for Composite Formatting methods

supongo que es ReSharper que es resposible para ellos, y parece que se acaba haciendo caso omiso de los argumentos de formato y sin dar ninguna ayuda "IntelliSense". Esto no es bueno ya que los otros desarrolladores que usarán la fachada esperarán esto.

¿Cómo llego resaltado argumento y "IntelliSense" para los métodos personalizados con formato similar a cómo funcionan:

Console.WriteLine(...) 
String.Format(...) 
etc... 

se agradecería cualquier ayuda.

Respuesta

29

Echa un vistazo a ReSharpers External Annotations. Específicamente, desea usar StringFormatMethodAttribute para esto.

Para utilizar las anotaciones externas, en realidad hay 3 métodos. Dos que deletrea, y uno que debes leer entre líneas para ver.

  1. Referencia "JetBrains.Annotations.dll". Yo recomendaría contra este. No me gusta la idea de copiar el archivo DLL o tener que hacer referencia al directorio de instalación de ReSharper. Esto podría causar problemas si actualiza o reinstala.

  2. Copiando y pegando declaraciones de atributos en su solución. Lo recomendaría ya que te da más control. Además, puedes deshacerte de ReSharper (¿por qué alguien haría esto? Supongo que cosas más extrañas sucedieron), y aun así proporcionar esta función a cualquiera que consuma tu biblioteca. Hay instrucciones paso a paso sobre cómo hacer esto en el primer enlace.

  3. Cree un archivo XML, similar al que usa para los ensamblados .NET. Hice esto para el marco de prueba de unidad de Silverlight. ReSharper no reconoce estas pruebas por defecto.

    Para hacer esto

    1. Crear un nombre de archivo <assembly>.xml y la puso en "ReSharper \ vxx \ bin \ ExternalAnnotations".
    2. Agregue un elemento raíz "<assembly name="<assembly>">
    3. Agregue <member> elementos para cada miembro al que desee otorgar un atributo.

    No recomiendo hacer esto para su propio código. Sin embargo, si tiene un ensamblado que desea tener esta funcionalidad, pero no puede editar, esta es la manera de hacerlo. Esto solo se aplicará en su máquina y cada desarrollador que use el ensamblaje deberá copiar el archivo xml.

+2

Sobre la tercera forma de añadir anotaciones - usted puede poner el archivo XML anotación cerca del conjunto, nombrarlo por .ExternalAnnotations.xml y comprometer a sus CVS. Todos los demás desarrolladores lo obtendrán automáticamente durante la actualización. – derigel

+0

@derigel Buena llamada. Me olvidé de eso. Apuesto a que podrías hacer algo para incluir esto en un paquete NuGet también. Sin embargo, aún recomendaría la opción 2, si está disponible. – cadrell0

+2

Para realizar el paso 2 como se sugiere: http://www.jetbrains.com/resharper/webhelp/Code_Analysis__Annotations_in_Source_Code.html – Oliver

Cuestiones relacionadas