2011-09-14 19 views
37

Tengo un objeto con un método personalizado WriteLine(string). Algo como esto:Cómo imitar string.Format() en mi propio método?

public void WriteLine(string text) 
{ 
    this.StringList.Add(text); 
} 

¿Cuál es la forma más fácil de duplicar la funcionalidad de string.Format() con este método? Por ejemplo: Lo que actualmente menudo encuentro haciendo es la siguiente:

myObj.WriteLine(string.Format("Hello, {0}", name)); 

Si crea una nueva aplicación de consola de su versión de un método WriteLine() hace exactamente lo que yo preferiría hacer:

Console.WriteLine("Hello, {0}", name); 

Ellos elimine la necesidad de llamar al string.Format(). ¿Es fácil hacer que tu método acepte esto de alguna manera? ¿O tendré que crear miles de sobrecargas de métodos? Algo como esto:

public void WriteLine() { ... } 

public void WriteLine(string text) { ... } 

public void WriteLine(string text, object arg0) { ... } 

public void WriteLine(string text, object arg0, object arg1) { ... } 

public void WriteLine(string text, object arg0, object arg1, object arg2) 
{ 
    this.StringList.Add(string.Format(text, arg0, arg1, arg2)); 
} 

// etc etc etc 

¿Es esa la única forma lógica de hacer esto? Cualquier sugerencia es bienvenida :)

+1

¿Por qué no simplemente delegar a 'string.Format'? ¿De verdad quieres escribir un tokenizer? – Oded

+10

Hay una característica de C# que no conoces que debes conocer. http://msdn.microsoft.com/en-us/library/w5zay9db(v=VS.100).aspx –

+0

@Oded esa es mi pregunta ... no tenía conocimiento de la palabra clave 'params' y no sabía que incluso *** podría *** delegar a 'string.Format'. – Chev

Respuesta

60

Debe copiar la firma del método de string.format.

public void WriteLine(string text,params object[] args) { 
    this.StringList.Add(string.Format(text,args)); 
} 

Como sugiere ChaosPandion También puede incluir sobrecargas para evitar la creación de la matriz

public void WriteLine(string text) { 
    this.StringList.Add(text); 
} 

public void WriteLine(string text,object arg0) { 
    this.StringList.Add(string.Format(text, arg0)); 
} 

public void WriteLine(string text,object arg0, object arg1) { 
    this.StringList.Add(string.Format(text, arg0, arg1)); 
} 

public void WriteLine(string text,object arg0, object arg1, object arg2) { 
    this.StringList.Add(string.Format(text, arg0, arg1, arg2)); 
} 

yo no iría arg2 pasado como string.format no lo hace el beneficio desaparece.

+0

¡Perfecto! Siempre me alegro cuando me tomo el tiempo para publicar una pregunta adecuada antes de perder el tiempo haciendo algo tedioso. Casi siempre hay una mejor manera. ¡Gracias! – Chev

+2

Agregaría sobrecargas para evitar la creación de Array para casos simples. Tal vez hasta 4 args. – ChaosPandion

+0

@ ChaosPandion Buena sugerencia. Seguí tu consejo. – Chev

6

Usted podría utilizar params:

public void WriteLine(string text, params object[] parameters) 
{ 
    //.. 
} 
7

Hay un caso extremo es posible que desee tener cuidado en evitar. El siguiente código escribirá la cadena {0} a la consola

Console.WriteLine("{0}"); 

Sin embargo, se utiliza una de las implementaciones de WriteLine sugeridos por otros en esta respuesta, las implementaciones se producirá una excepción:

WriteLine("{0}"); //throws exception 

la solución más fácil es o bien tienen dos sobrecargas de WriteLine o para modificar el código sugerido ligeramente para manejar el caso extremo:

public void WriteLine(string text,params object[] args) { 
    var message=args.Length==0 ? text : string.Format(text, args); 
    this.StringList.Add(message); 
} 
+0

Ya tuve una sobrecarga por tan solo una cuerda, así que eso no es un problema para mí. Gracias por llamar la atención sobre eso :) – Chev

Cuestiones relacionadas