2010-03-30 15 views

Respuesta

7

Prueba esto: el uso

class MyConsole : TextWriter { 
    TextWriter mOldConsole; 
    bool mDoIndent; 

    public MyConsole() { 
     mOldConsole = Console.Out; 
     Console.SetOut(this); 
    } 

    public int Indent { get; set; } 

    public override void Write(char ch) { 
     if (mDoIndent) { 
      mDoIndent = false; 
      for (int ix = 0; ix < Indent; ++ix) mOldConsole.Write(" "); 
     } 
     mOldConsole.Write(ch); 
     if (ch == '\n') mDoIndent = true; 
    } 

    public override System.Text.Encoding Encoding { 
     get { return mOldConsole.Encoding; } 
    } 
} 

muestra:

class Program { 
    static MyConsole Output = new MyConsole(); 
    static void Main(string[] args) { 
     Console.WriteLine("Hello"); 
     Output.Indent++; 
     Console.WriteLine("world"); 
     Output.Indent--; 
     Console.WriteLine("Back"); 
     Console.ReadLine(); 
    } 
} 
+0

Bonito, maneja caracteres de nueva línea como se esperaba. – AMissico

+0

Anywhay para "extender" la consola para hacer que la sintaxis sea más natural, como Console.Indent ++; – AMissico

+0

@AMissico: No, la consola está sellada. –

2

por lo general sólo hacer algo como esto (en mi clase de aplicación):

static TextWriter tw; 
static int indentLevel = 0; 

static void Indend() 
{ 
    indentLevel++; 
} 

static void Outdent() 
{ 
    indentLevel--; 
} 

static void WriteLine(string s) 
{ 
    tw.WriteLine(new string('\t', indentLevel) + s); 
} 

static void WriteLine() 
{ 
    tw.WriteLine(); 
} 

y luego, por ejemplo,

using (tw = new StreamWriter(outputName)) 
{ 
    WriteLine(string.Format("namespace {0}", nameSpace)); 
    WriteLine("{"); 

    Indend(); 

    foreach (string s in dataSourceItems) 
     GenerateProc(s); 

    Outdent(); 

    WriteLine("}"); 
} 

Obviamente puede encapsular esto en una clase separada si lo desea.

9

System.CodeDom.Compiler.IndentedTextWriter

Este está integrado en el .Net Framework en system.dll, pero no es super-resistente . Debería funcionar bajo un uso restringido (como no tener un carácter de nueva línea en una cadena).

static void Main(string[] args) 
    { 
     using (System.CodeDom.Compiler.IndentedTextWriter writer = new System.CodeDom.Compiler.IndentedTextWriter(Console.Out, " ")) 
     { 
      Console.SetOut(writer); 
      writer.Indent = 0; 
      writer.WriteLine("test"); 
      writer.Indent = 1; 
      writer.WriteLine("What happens\nif there are line-\nbreak in the middle?"); 
      writer.Indent = 2; 
      writer.WriteLine("another test"); 
      writer.Indent = 3; 
      writer.WriteLine("and another test"); 
      writer.Indent = 0; 
      writer.WriteLine("hello"); 
     } 
     Console.ReadLine(); 
    } 
+1

+1 para un buen código de ejemplo – AMissico

Cuestiones relacionadas