【问题标题】:.NET Console TextWriter that Understands Indent/Unindent/IndentLevel.NET 控制台 TextWriter 可以理解 Indent/Unndent/IndentLevel
【发布时间】:2011-02-02 14:18:11
【问题描述】:

是否有人拥有或知道控制台的 TextWriter 了解如何缩进/取消缩进并能够设置缩进级别。

【问题讨论】:

    标签: .net console console-application


    【解决方案1】:

    我通常只是做这样的事情(在我的应用程序类中):

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

    如果你愿意,显然可以将它封装在一个单独的类中。

    【讨论】:

      【解决方案2】:

      试试这个:

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

      【讨论】:

      • 很好,按预期处理换行符。
      • 随便“扩展” Console 让语法更自然,比如 Console.Indent++;
      • @AMissico:不,控制台是密封的。
      【解决方案3】:

      System.CodeDom.Compiler.IndentedTextWriter

      这是在 system.dll 中内置到 .Net 框架中的,但它不是超级健壮的。它应该在受限制的使用情况下工作(比如字符串中没有换行符)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        相关资源
        最近更新 更多