2012-04-26 12 views
10

Estoy buscando una forma de insertar un prefijo (fecha y hora) en cada Console.Write [Line]. Estoy buscando una forma recomendada de hacerlo, al igual que la forma recomendada para cambiar la salida es usar Console.SetOut.¿Cuál es la forma recomendada de prefijo Console.Write?

Soy consciente de que puedo hacer String.Format ("{0} {1}", DateTime.Now, msg), pero estoy tratando de dejar eso como último recurso.

El problema es que la salida se puede cambiar en tiempo de ejecución y la predeterminada ya anexa la hora actual. Si lo agrego a mi código, duplicaré la fecha.

¿Existe tal cosa? Estoy usando Monotouch, por lo que solo puedo usar bibliotecas compiladas para él.

Respuesta

11

Es necesario inherit de System.IO.TextWrite, proporcionar un Encoding y sustituciones de ejemplo WriteLine y Write. Almacene el original Console.Out antes de cambiar con Console.setOut(x).

Aquí está un ejemplo de código completo:

class PrefixedWriter : TextWriter 
{ 
    private TextWriter originalOut; 

    public PrefixedWriter() 
    { 
     originalOut = Console.Out; 
    } 

    public override Encoding Encoding 
    { 
     get { return new System.Text.ASCIIEncoding(); } 
    } 
    public override void WriteLine(string message) 
    { 
     originalOut.WriteLine(String.Format("{0} {1}", DateTime.Now, message)); 
    } 
    public override void Write(string message) 
    { 
     originalOut.Write(String.Format("{0} {1}", DateTime.Now, message)); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.SetOut(new PrefixedWriter()); 
     Console.WriteLine("test 1 2 3"); 
     Console.ReadKey(); 
    } 
} 
+0

Esa es la mejor manera. MonoTouch 5.3+ redirecciona 'Console.Write *' a 'NSLog' para evitar la limitación ** stdout ** que Apple agregó en iOS 5.1. La versión preliminar del código fuente está disponible en mi blog: http://spouliot.wordpress.com/2012/03/13/ios-5-1-vs-stdout/ – poupou

+0

Me encanta cómo se integra bien y resuelve el problema con fechas dobles mencionadas en la pregunta –

9

Puede reemplazar la llamada de consola con su propia clase.

class MyConsole 
{ 
    public static void WriteLine(string msg) 
    { 
     Console.Write(String.Format("{0} {1}", DateTime.Now, msg)); 
    } 
} 

Luego, por supuesto, todas las llamadas a convertirse en Console.WriteMyConsole.Write.

También puede tomar un paso más allá y el alias Console con MyConsole en todos los archivos de código ...

using Console = MyNamespace.MyConsole; 
+0

Esto es exactamente lo que estoy haciendo en este momento. Me preguntaba si había una forma de conectarme a la arquitectura actual. –

+0

Aunque esta solución funciona, no tiene que ver con la fecha doble cuando se usa la salida original de la consola. –

Cuestiones relacionadas