2012-04-26 4 views
10

Ich suche nach einer Möglichkeit, ein Präfix (Datum und Uhrzeit) zu jedem Console.Write [Line] einzufügen. Ich bin auf der Suche nach einem empfohlenen Weg, wie die empfohlene Möglichkeit zur Änderung der Ausgabe ist Console.SetOut zu verwenden.Wie empfiehlt sich Console.Write?

Ich bin mir bewusst, dass ich String.Format ("{0} {1}", DateTime.Now, msg) tun kann, aber ich versuche, das als mein letzter Ausweg zu verlassen.

Das Problem besteht darin, dass die Ausgabe zur Laufzeit änderbar ist, und die Standardausgabe bereits die aktuelle Uhrzeit anfügt. Wenn ich es an meinen Code anschließe, werde ich das Datum duplizieren.

Gibt es so etwas? Ich verwende Monotouch, daher kann ich nur Bibliotheken verwenden, die dafür kompiliert wurden.

Antwort

11

Sie müssen inherit von System.IO.TextWrite, stellen ein Encoding und Überschreibungen für z.B. WriteLine und Write. Lagern Sie das Original Console.Out bevor Sie es mit Console.setOut(x) ändern.

ist das komplette Codebeispiel:

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

Das ist der beste Weg. MonoTouch 5.3+ leitet die 'Console.Write *' auf 'NSLog' um, um die ** stdout ** Beschränkung zu umgehen, die Apple in iOS 5.1 hinzugefügt hat. Die vorläufige Version des Quellcodes ist auf meinem Blog verfügbar: http://spouliot.wordpress.com/2012/03/13/ios-5-1-vs-stdout/ – poupou

+0

Liebe, wie es schön integriert und löst das Problem mit doppelte Daten in der Frage erwähnt –

9

Sie könnten den Konsolenanruf einfach durch Ihre eigene Klasse ersetzen.

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

Dann natürlich alle Anrufe an Console.Write werden MyConsole.Write.

Sie konnte es auch einen Schritt weiter und alias Console mit MyConsole in allen Code-Dateien ...

using Console = MyNamespace.MyConsole; 
+0

Das ist genau das, was ich jetzt mache. Ich frage mich, ob es einen Weg gab, um sich an die aktuelle Architektur anzuschließen. –

+0

Obwohl diese Lösung funktioniert, behandelt sie nicht das doppelte Datum, wenn die ursprüngliche Konsolenausgabe verwendet wird. –

Verwandte Themen