2010-03-30 31 views

Trả lời

7

Hãy thử điều này: sử dụng

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

mẫu:

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

Đẹp, xử lý ký tự dòng mới như mong đợi. – AMissico

+0

Bất cứ điều gì để "mở rộng" Console để làm cho cú pháp tự nhiên hơn, chẳng hạn như Console.Indent ++; – AMissico

+0

@AMissico: Không, Bảng điều khiển được niêm phong. –

2

Tôi thường chỉ làm một cái gì đó như thế này (trong lớp ứng dụng của tôi):

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

và sau đó ví dụ

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

    Indend(); 

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

    Outdent(); 

    WriteLine("}"); 
} 

Bạn rõ ràng có thể gói gọn trong lớp học riêng nếu bạn muốn.

9

System.CodeDom.Compiler.IndentedTextWriter

này được xây dựng vào .Net Framework trong system.dll, nhưng nó không phải là siêu mạnh mẽ . Nó sẽ hoạt động dưới mức sử dụng hạn chế (như không có ký tự dòng mới trong chuỗi).

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 để có mã ví dụ tốt – AMissico

Các vấn đề liên quan