理解缩进/取消缩进/缩进级别的.NET控制台TextWriter

7

有没有人知道或者拥有一个适用于控制台的TextWriter,它能够理解缩进/取消缩进并且具有设置缩进级别的功能。

3个回答

11

System.CodeDom.Compiler.IndentedTextWriter

这个是内置在system.dll中的 .Net Framework类,但它并不是非常强大。它应该可以在受限制的使用情况下工作(例如在字符串中不存在换行符)。

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

8

试试这个:

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

很好,按预期处理换行符。 - AMissico
有没有任何方法可以“扩展”控制台,使语法更加自然,例如Console.Indent++? - AMissico
@AMissico:不,Console是密封的。 - Hans Passant

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

如果您喜欢,显然可以将此内容封装在单独的类中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接