2010-05-06 10 views
24

A menudo me siento frustrado por los métodos System.Diagnostics.Debug.Write/WriteLine. Me gustaría utilizar los métodos de escritura/WriteLine familiares de la clase TextWriter, así que a menudo escribir¿Hay una interfaz TextWriter para la clase System.Diagnostics.Debug?

Debug.WriteLine("# entries {0} for connection {1}", countOfEntries, connection); 

lo que provoca un error de compilación. Termino escribiendo

Debug.WriteLine(string.Format("# entries {0} for connection {1}", 
    countOfEntries, connection)); 

que es realmente incómodo.

¿El CLR tiene una clase derivada de TextWriter que "cierra" System.Debug, o debería hacer mi propia?

Respuesta

8

¿Necesitas particularmente un total de TextWriter? Si bien esto es algo "rápido y sucio" Sospecho una clase estática con sólo unos pocos métodos haría muy bien:

public static class DebugEx 
{ 
    [Conditional("DEBUG")] 
    public static void WriteLine(string format, params object[] args) 
    { 
     Debug.WriteLine(string.Format(format, args)); 
    } 
} 

o algo similar.

Tenga en cuenta que, personalmente, me gustaría ver algo así como log4net para tener más control sobre la salida.

29

La función Debug.Print le permite usar el formato y los argumentos.

[editar:]

Si prefiere utilizar una interfaz deTextWriter, puede utilizar el siguiente:

public class DebugTextWriter : StreamWriter 
{ 
    public DebugTextWriter() 
     : base(new DebugOutStream(), Encoding.Unicode, 1024) 
    { 
     this.AutoFlush = true; 
    } 

    class DebugOutStream : Stream 
    { 
     public override void Write(byte[] buffer, int offset, int count) 
     { 
      Debug.Write(Encoding.Unicode.GetString(buffer, offset, count)); 
     } 

     public override bool CanRead { get { return false; } } 
     public override bool CanSeek { get { return false; } } 
     public override bool CanWrite { get { return true; } } 
     public override void Flush() { Debug.Flush(); } 
     public override long Length { get { throw new InvalidOperationException(); } } 
     public override int Read(byte[] buffer, int offset, int count) { throw new InvalidOperationException(); } 
     public override long Seek(long offset, SeekOrigin origin) { throw new InvalidOperationException(); } 
     public override void SetLength(long value) { throw new InvalidOperationException(); } 
     public override long Position 
     { 
      get { throw new InvalidOperationException(); } 
      set { throw new InvalidOperationException(); } 
     } 
    }; 
} 
13

Aquí hay un ir rápido en un envoltorio TextWriter para System.Diagnostics .Debug:

class TextWriterDebug : System.IO.TextWriter 
{ 
    public override System.Text.Encoding Encoding 
    { 
     get { return System.Text.Encoding.Default; } 
    } 

    //public override System.IFormatProvider FormatProvider 
    //{ get; } 
    //public override string NewLine 
    //{ get; set; } 

    public override void Close() 
    { 
     System.Diagnostics.Debug.Close(); 
     base.Close(); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
    } 

    public override void Flush() 
    { 
     System.Diagnostics.Debug.Flush(); 
     base.Flush(); 
    } 

    public override void Write(bool value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(char value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(char[] buffer) 
    { 
     System.Diagnostics.Debug.Write(buffer); 
    } 

    public override void Write(decimal value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(double value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(float value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(int value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(long value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(object value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(string value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(uint value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(ulong value) 
    { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override void Write(string format, object arg0) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg0)); 
    } 

    public override void Write(string format, params object[] arg) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg)); 
    } 

    public override void Write(char[] buffer, int index, int count) 
    { 
     string x = new string(buffer, index, count); 
     System.Diagnostics.Debug.Write(x); 
    } 

    public override void Write(string format, object arg0, object arg1) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg0, arg1)); 
    } 

    public override void Write(string format, object arg0, object arg1, object arg2) 
    { 
     System.Diagnostics.Debug.Write(string.Format(format, arg0, arg1, arg2)); 
    } 

    public override void WriteLine() 
    { 
     System.Diagnostics.Debug.WriteLine(string.Empty); 
    } 

    public override void WriteLine(bool value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(char value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(char[] buffer) 
    { 
     System.Diagnostics.Debug.WriteLine(buffer); 
    } 

    public override void WriteLine(decimal value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(double value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(float value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(int value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(long value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(object value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(string value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(uint value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(ulong value) 
    { 
     System.Diagnostics.Debug.WriteLine(value); 
    } 

    public override void WriteLine(string format, object arg0) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg0)); 
    } 

    public override void WriteLine(string format, params object[] arg) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg)); 
    } 

    public override void WriteLine(char[] buffer, int index, int count) 
    { 
     string x = new string(buffer, index, count); 
     System.Diagnostics.Debug.WriteLine(x); 

    } 

    public override void WriteLine(string format, object arg0, object arg1) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg0, arg1)); 
    } 

    public override void WriteLine(string format, object arg0, object arg1, object arg2) 
    { 
     System.Diagnostics.Debug.WriteLine(string.Format(format, arg0, arg1, arg2)); 
    } 

} // Ends class TextWriterDebug 
+0

¿Creó este contenedor manualmente? De lo contrario, ¿qué herramienta usaste para autogenerar el código? – sammarcow

+0

@sammarcow Hice algo así como tomar el esquema generado por metadatos de TextWriter en Visual Studio, cortarlo y pegarlo, e ir desde allí. Fue hace un tiempo. – WaffleSouffle

+1

Esto es bueno. Un punto a considerar: no estoy seguro de querer cerrar todos los detectores de seguimiento de depuración cuando este TextWriter está cerrado, sin embargo. – codekaizen

Cuestiones relacionadas