14

すべての Console.Write[Line] にプレフィックス (日付と時刻) を挿入する方法を探しています。出力を変更するための推奨される方法がConsole.SetOutを使用するのと同じように、推奨される方法を探しています。

私は String.Format("{0} {1}", DateTime.Now, msg) を実行できることをよく知っていますが、最後の手段としてそれを残そうとしています。

問題は、出力が実行時に変更可能であり、デフォルトの出力に現在の時刻が既に追加されていることです。コードに追加すると、日付が複製されます。

そのようなことはありますか?私は Monotouch を使用しているため、Monotouch 用にコンパイルされたライブラリしか使用できません。

4

2 に答える 2

17

から継承し、たとえばandのオーバーライドをSystem.IO.TextWrite提供する必要があります。で変更する前の原稿を保管してください。EncodingWriteLineWriteConsole.OutConsole.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ます。

さらに一歩進んで、すべてのコードファイルでエイリアスConsoleを使用することもできます...MyConsole

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