2010-03-30 2 views

risposta

7

Prova questo: l'utilizzo

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; } 
    } 
} 

Esempio:

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

Bello, gestisce i caratteri di nuova riga come previsto. – AMissico

+0

Anywhay per "estendere" la console per rendere la sintassi più naturale, come Console.Indent ++; – AMissico

+0

@AMissico: No, la console è sigillata. –

2

Io di solito solo fare qualcosa di simile (all'interno della mia classe di app):

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(); 
} 

e poi per esempio

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

    Indend(); 

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

    Outdent(); 

    WriteLine("}"); 
} 

Si può ovviamente incapsulare questo in una classe separata, se lo si desidera.

9

System.CodeDom.Compiler.IndentedTextWriter

Questo è costruito per il .Net Framework in system.dll, ma non è super-resistente . Dovrebbe funzionare con un uso limitato (come non avere un carattere di fine riga in una stringa).

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 per un buon codice di esempio – AMissico