2012-04-26 971 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

相关问题