2012-04-26 38 views
10

我正在尋找一種方法來爲每個Console.Write [Line]插入前綴(日期和時間)。我正在尋找推薦的方式來執行此操作,就像更改輸出的推薦方式是使用Console.SetOut。我很清楚,我可以做String.Format(「{0} {1}」,DateTime.Now,味精),但我試圖離開那作爲我的最後手段。對Console.Write加前綴的建議方法是什麼?

問題是輸出在運行時是可以改變的,而默認的輸出已經附加了當前時間。如果我將它附加在我的代碼上,我將複製日期。

有這樣的事嗎?我正在使用Monotouch,所以我只能使用爲它編譯的庫。

回答

11

您需要inheritSystem.IO.TextWrite,提供Encoding和例如覆蓋WriteLineWrite。在更改Console.setOut(x)之前,請保存原始Console.Out

下面是一個完整的代碼示例:

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

這是最好的方法。 MonoTouch 5.3+將'Console.Write *'重定向到'NSLog'以解決Apple 5.1在iOS 5.1中添加的** stdout **限制。源代碼的初步版本可在我的博客上找到:http://spouliot.wordpress.com/2012/03/13/ios-5-1-vs-stdout/ – poupou 2012-04-26 21:22:14

+0

愛它如何很好地集成並解決問題問題中提到的雙重日期 – 2012-04-27 18:37:25

9

你可以用你自己的類來替換控制檯調用。

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

然後當然要Console.Write所有通話變得MyConsole.Write

你也可以把它更進一步,別名Console在所有代碼文件MyConsole ...

using Console = MyNamespace.MyConsole; 
+0

這正是我現在在做。想知道是否有辦法插入到當前體系結構中 – 2012-04-26 21:05:37

+0

儘管此解決方案有效,但它在使用原始控制檯輸出時不處理雙重日期。 – 2012-04-27 18:38:02

相關問題