2010-02-10 1 views
0

Как реализовать вспомогательный отступ в пользовательском TraceListener?Отступы в пользовательском TraceListener

Trace.Indent(); 
// or 
Trace.Unindent(); 

не работает, даже если есть реализация для:

protected override void WriteIndent() { ... } 

В этой пользовательской TraceListener.

Я что-то упустил?

+0

Итак, были ли некоторые из предложений полезными? –

+0

См. Мой повтор (коды перепутаны в комментариях). –

ответ

1

Я выяснил, что эти 2 статических метода Trace меняют IndentLevel. Поэтому я делаю это:

... 
if (entry.IndentLevel > 0) 
    writer.WriteLine(
     new string(' ', entry.IndentLevel * IndentSize) + 
... 
1

Класс TextWriterTraceListener. Он поддерживает отступы.

+0

Спасибо. TextWriterTraceListener не многопоточен. BTW мой прослушиватель трассировки работает отлично (пока !, потому что это многопоточное приложение ... вы знаете;)). –

1

Я думаю, что вам нужно позвонить непосредственно WriteIndent (если я правильно интерпретирую документацию). Этот код работает так, как ожидалось:

using System; 
using System.Xml.Serialization; 
using System.Diagnostics; 

class Program { 

    class TestListener : TraceListener { 

     protected override void WriteIndent() { 
      if (NeedIndent) { 
       string indent = new string(' ',IndentLevel * IndentSize); 
       Console.Write(indent); 
      } 
     } 

     public override void Write(string message) { 
      WriteIndent(); 
      Console.Write(message); 
     } 

     public override void WriteLine(string message) { 
      WriteIndent(); 
      Console.WriteLine(message); 
     } 
    } 


    public static void Main(params string[] args) { 

     Trace.Listeners.Add(new TestListener()); 
     Trace.IndentSize = 2; 
     Trace.WriteLine("test"); 
     Trace.IndentLevel = 4; 
     Trace.WriteLine("indented"); 
    } 
} 
+0

Спасибо. Я сделал что-то подобное. Я заметил, что Trace.Indent и Unindent изменяет IndentLevel. Я использую это свойство, чтобы выяснить, нужно ли вставлять отступы. –