2010-03-30 82 views

回答

7

試試這個:

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

使用範例:

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

不錯,按預期處理換行符。 – AMissico 2010-03-31 15:50:34

+0

Anywhay「擴展」控制檯以使語法更自然,如Console.Indent ++; – AMissico 2010-03-31 15:51:44

+0

@AMISSico:不,控制檯是密封的。 – 2010-03-31 16:10:02

2

我通常只是做這樣的事情(我的應用程序類中):

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

,然後如

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

    Indend(); 

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

    Outdent(); 

    WriteLine("}"); 
} 

如果你願意,你明顯可以把它封裝在一個單獨的類中。

9

System.CodeDom.Compiler.IndentedTextWriter

這是建立在.NET框架在System.dll中,但它不是超級強大的。它應該在約束用法下工作(如在字符串中沒有換行符)。

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代表很好的示例代碼 – AMissico 2010-03-31 16:24:22