什么是Console.Write的推荐前缀方式?

14
我正在寻找一种方法,在每个Console.Write[Line]前插入一个前缀(日期和时间)。我正在寻找一种推荐的方法来做到这一点,就像更改输出的推荐方式是使用 Console.SetOut 一样。
我很清楚我可以使用 String.Format("{0} {1}", DateTime.Now, msg) 来完成这个任务,但我想把它留作最后的选择。
问题在于输出可以在运行时更改,并且默认输出已经附加了当前时间。如果我在我的代码中附加它,我将重复日期。
是否有这样的东西?我正在使用 Monotouch,因此只能使用为其编译的库。
2个回答

17

你需要从 System.IO.TextWriter 继承,提供一个 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();
    }
}

这是最好的方法。MonoTouch 5.3+将Console.Write*重定向到NSLog以解决苹果在iOS 5.1中添加的stdout限制。源代码的初步版本可在我的博客上找到:http://spouliot.wordpress.com/2012/03/13/ios-5-1-vs-stdout/ - poupou
喜欢它如何很好地集成并解决了问题,这个问题中提到了双重日期。 - Jonas Stawski

8
您可以用您自己的类替换掉 Console 调用。
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;

这正是我现在正在做的事情。想知道是否有一种方法可以插入到当前的架构中。 - Jonas Stawski
虽然这个解决方案可行,但在使用原始控制台输出时无法处理双日期。 - Jonas Stawski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接