根据上篇中介绍的策略,每一个调用栈在进入和离开时都要进行类似下面的处理:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
/// Gets the name.
/// </summary>
/// <returns></returns>
public string getName()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
string ret = "";
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
MethodInfo method = (MethodInfo)MethodInfo.GetCurrentMethod();
Debug.WriteLine(string.Format("Enter {0}.{1}", method.DeclaringType.FullName, method.Name));
Debug.Indent();
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this._cmdrp.Item = new noParamType();
this.internalExecute();
ret=((stringReturnType)this._replyrp.Item).returnValue;
}
Debug.Unindent();
Debug.WriteLine(string.Format("Leave {0}.{1}", method.DeclaringType.FullName, method.Name));
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return ret;
}
由此带来的问题是:当调用层次太深的时候,输出的调试信息量太多了,虽然层次分明的缩进可以帮我们理清思路,但是在纷繁众多的信息中想要找到我们所需的谈何容易啊,如下所示:
![](https://www.cnblogs.com/images/cnblogs_com/swnuwangyun/beforecolor.JPG)
因此考虑根据缩进层次着色,幸好我采用的是RichTextBox,太容易了,修改上篇中的继承类中的函数如下:
private void WriteImpl(string message)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if (this.NeedIndent)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.WriteIndent();
this.NeedIndent = true;
}
Color color = new Color();
switch (this.IndentLevel)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
case 0:
color = Color.FromArgb(0, 250, 0);
break;
case 1:
color = Color.FromArgb(50, 200, 0);
break;
case 2:
color = Color.FromArgb(100, 150, 0);
break;
case 3:
color = Color.FromArgb(150, 100, 0);
break;
case 4:
color = Color.FromArgb(200, 50, 0);
break;
default:
color = Color.FromArgb(250, 0, 0);
break;
}
this._richTextBox.Select(this._richTextBox.Text.Length, 0);
this._richTextBox.SelectionBackColor = color;
this._richTextBox.AppendText(message);
this._richTextBox.Select(this._richTextBox.Text.Length, 0);
this._richTextBox.ScrollToCaret();
}
具体的颜色值可以根据自己的爱好进行调整,最终的调试输出如下:
![](https://www.cnblogs.com/images/cnblogs_com/swnuwangyun/aftercolor.JPG)
瞧,是不是很有层次感啊! 完整源码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
MyTraceListener
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Windows.Forms;
using System.Drawing;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace RPTestApp
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
class MyTraceListener : TraceListener
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
private RichTextBox _richTextBox = null;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public MyTraceListener(RichTextBox richTextBox)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this._richTextBox = richTextBox;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private delegate void WriteDelegate(string message);
private void WriteImpl(string message)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (this.NeedIndent)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.WriteIndent();
this.NeedIndent = true;
}
Color color = new Color();
switch (this.IndentLevel)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
case 0:
color = Color.FromArgb(0, 250, 0);
break;
case 1:
color = Color.FromArgb(50, 200, 0);
break;
case 2:
color = Color.FromArgb(100, 150, 0);
break;
case 3:
color = Color.FromArgb(150, 100, 0);
break;
case 4:
color = Color.FromArgb(200, 50, 0);
break;
default:
color = Color.FromArgb(250, 0, 0);
break;
}
this._richTextBox.Select(this._richTextBox.Text.Length, 0);
this._richTextBox.SelectionBackColor = color;
this._richTextBox.AppendText(message);
this._richTextBox.Select(this._richTextBox.Text.Length, 0);
this._richTextBox.ScrollToCaret();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public override void Write(string message)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//This is for thread safety
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
this._richTextBox.Invoke(new WriteDelegate(this.WriteImpl), new object[]
{ message });
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public override void WriteLine(string message)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.Write(message + Environment.NewLine);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
}