是否有人知道或知道控制台的TextWriter,它理解如何缩进/取消,并且能够设置缩进级别。
答案 0 :(得分:9)
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();
}
答案 1 :(得分: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();
}
}
答案 2 :(得分:2)
我通常只是这样做(在我的app类中):
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("}");
}
如果你愿意,你可以将它封装在一个单独的类中。