代码之家  ›  专栏  ›  技术社区  ›  AMissico

了解indent/unindent/indentlevel的.NET控制台文本编写器

  •  5
  • AMissico  · 技术社区  · 14 年前

    是否有人知道控制台的文本编写器,了解如何缩进/取消缩进,并且能够设置缩进级别。

    3 回复  |  直到 9 年前
        1
  •  7
  •   Hans Passant    14 年前

    试试这个:

    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();
        }
    }
    
        2
  •  9
  •   Jeffrey L Whitledge    14 年前

    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();
        }
    
        3
  •  2
  •   Shimmy Weitzhandler 500 - Internal Server Error    9 年前

    我通常会这样做(在我的应用程序类中):

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

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