Debug işlemleri yaparken sıklıkla karşılşatığımızın durumların başında nesnemiz başka bir nesneyi içeriyorsa bu nesneyi ancak hiyeraşik bir biçimde inceleme şansına sahip oluyoruz. Aşağıdaki resimde daha net birşekilde ne demek istediğim belli oluyor.

Görüldüğü gibi Report nesnemiz içerde List<int> türünden Results özelliğine (property) sahip. Bu özelliğin hangi değerlerini tuttuğunu görmek için + ile detayına inip bakmamız gerekiyor. Bu özellik baska bir nesneyi temsil ediyor, ve o nesne de içerisinde iç içe (nested ) başka değerleri tutuyor olabilir. Bu durumda + lar ile detaylara inip boğulabilirsiniz
Ama çoğumuz bu iç içe nesnelerin aslında sadece işimize yarayacak kısmını debug işlemi sırasında görmek isteyebilir, hatta bu kısımları özelleştirerek istediğimiz gibi bir görüntü sağlayabiliriz. Aşağıdaki resim ile bir önceki resimi kıyaslayarak debug işlemi sırasındaki görüntüleri karşılaştırabilirsiniz.

Bu görüntünün sağlabilmesi için yapmamız gereken Report nesnemizin debug işlemi sırasında görünmesini isteyeceğimiz şekilde bir proxy class'ını hazırlamak.
[DebuggerTypeProxy(typeof(ReportDebuggerProxy))]
public class Report
{
private DateTime _date;
public DateTime ReportDate
{
get { return _date; }
set { _date = value; }
}
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private List<int> _results = new List<int>();
public List<int> Results
{
get { return _results; }
set { _results = value; }
}
private int _dummy;
public int Dummy
{
get { return _dummy; }
set { _dummy = value; }
}
}
Report nesnemize DebuggerTypeProxy attribute'nün uygulandığı dikkatinizi çekmiştir. Bu atrribute sayesinde Report nesensi debug işlemi sırasında sanki Report türünden bir nesne değil de ReportDebuggerProxy nesnesinin bir görüntüsüymüş gibi karşımıza çıkacaktır. Şimdi proxy görevini görecek sınıfımızı yazalım.
public class ReportDebuggerProxy
{
Report _report;
public ReportDebuggerProxy(Report report)
{
_report = report;
}
public string ReportDate
{
get { return _report.ReportDate.ToLongDateString();}
}
public string Name
{
get { return "Raport Name : " + _report.Name; }
}
public string Results
{
get
{
StringBuilder sb = new StringBuilder();
foreach (int result in _report.Results)
{
sb.Append("(");
sb.Append(result.ToString());
sb.Append(") ");
}
return sb.ToString();
}
}
}
Görüldüğü gibi debug sırasında görmek istediğimiz özellikleri belirtiyoruz. Proxy sınıfında dikkat ederseniz Report sınıfındaki Dummy özelliğine yer verilmemiş ve diğer özellikler ise görülmek istendiği şekilde özelleştirilmiş.