2012-04-26 16 views
10

Szukam sposobu wstawienia prefiksu (data i czas) do każdego Console.Write [Line]. Szukam zalecanego sposobu, aby to zrobić, tak jak zalecany sposób zmiany wyniku jest użycie Console.SetOut.Jaki jest zalecany sposób na prefiks Console.Write?

Jestem świadomy, że mogę zrobić String.Format ("{0} {1}", DateTime.Now, msg), ale staram się zostawić to jako moją ostatnią deskę ratunku.

Problem polega na tym, że dane wyjściowe można zmieniać w czasie wykonywania, a wartość domyślna już dołącza bieżący czas. Jeśli dołączę to do mojego kodu, powielę datę.

Czy jest coś takiego? Używam Monotouch, więc mogę korzystać tylko z bibliotek skompilowanych dla niego.

Odpowiedz

11

Trzeba inherit z System.IO.TextWrite zapewnił uruchomienie Encoding i przesłonięcia na przykład WriteLine i Write. Przed zmianą Console.setOut(x) zapisz oryginał Console.Out.

Oto pełna przykładowy kod:

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

To najlepszy sposób. MonoTouch 5.3+ przekieruj 'Console.Write *' do 'NSLog', aby obejść ograniczenie ** stdout ** Apple dodane w iOS 5.1. Wstępna wersja kodu źródłowego jest dostępna na moim blogu: http://spouliot.wordpress.com/2012/03/13/ios-5-1-vs-stdout/ – poupou

+0

Kochaj, jak to ładnie integruje i rozwiązuje problem z podwójne daty wymienione w pytaniu –

9

Można po prostu zamienić wywołanie konsoli na własną klasę.

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

Potem oczywiście wszystkie połączenia Console.Write stać MyConsole.Write.

Można również zgłosić się o krok dalej i alias Console z MyConsole we wszystkich plikach kod ...

using Console = MyNamespace.MyConsole; 
+0

To jest dokładnie to, co robię teraz. Czy zastanawiałeś się, czy istnieje sposób podłączenia do obecnej architektury? –

+0

Chociaż to rozwiązanie działa, nie zajmuje się podwójną datą podczas używania oryginalnego wyjścia konsoli. –

Powiązane problemy