14

我正在寻找一种向每个 Console.Write[Line] 插入前缀(日期和时间)的方法。我正在寻找一种推荐的方法,就像改变输出的推荐方法是使用Console.SetOut一样。

我很清楚我可以执行 String.Format("{0} {1}", DateTime.Now, msg),但我试图将其作为最后的手段。

问题是输出在运行时是可变的,默认的已经附加了当前时间。如果我将它附加到我的代码上,我将复制日期。

有这样的事吗?我正在使用 Monotouch,所以我只能使用为其编译的库。

4

2 回答 2

17

您需要继承System.IO.TextWrite、提供Encoding和覆盖例如WriteLineWriteConsole.Out使用更改之前存储原件Console.setOut(x)

这是一个完整的代码示例:

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();
    }
}
于 2012-04-26T21:12:12.903 回答
9

您可以将 Console 调用替换为您自己的类。

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

然后,当然,所有调用Console.Write成为MyConsole.Write

您还可以更进一步,ConsoleMyConsole在所有代码文件中使用别名...

using Console = MyNamespace.MyConsole;
于 2012-04-26T21:01:38.613 回答