Какой рекомендуемый способ для префикса Console.Write?

Я ищу способ вставить префикс (дата и время) на каждый Console.Write [Line]. Я ищу рекомендуемый способ сделать это, так же как рекомендуемый способ изменения вывода - использовать Console.SetOut.

Мне хорошо известно, что я могу делать String.Format( "{0} {1}", DateTime.Now, msg), но я стараюсь оставить это как последнее средство.

Проблема заключается в том, что выход может меняться во время выполнения, а по умолчанию уже добавлено текущее время. Если я добавлю его в свой код, я продублирую дату.

Есть ли такая вещь? Я использую Monotouch, поэтому я могу использовать только библиотеки, скомпилированные для него.

Ответ 1

Вам нужно наследовать от System.IO.TextWrite, предоставить Encoding и переопределить, например. WriteLine и Write. Сохраните оригинал Console.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();
    }
}

Ответ 2

Вы можете просто заменить вызов 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;