//New .NET 2.0 Debugger Attributes examples
//Julie Lerman www.thedatafarm.com
//from my session on Customized Debugging in VS2005
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
namespace DebuggerTests
{
//note: DebuggerBrowsable is not in VB.NET
//DebuggerDisplay work a little differently n C# and VB ... check MSDN documentation for nuances
///
/// PLAIN Employee Class
///
public class EmployeeClassPlain
{
private string _firstname;
private string _lastname;
private AddressClass _address;
public EmployeeClassPlain(string firstname, string lastname, string street, string city)
{
_firstname = firstname;
_lastname = lastname;
_address = new AddressClass(street, city);
}
public string FirstName
{
get { return _firstname; }
set { _firstname = value; }
}
public string LastName
{
get { return _lastname; }
set { _lastname = value; }
}
public AddressClass Address
{
get { return _address; }
}
///
/// ADDRESS Class
///
public class AddressClass
{
private string _street;
private string _city;
public AddressClass(string street, string city)
{
_street = street;
_city = city;
}
public string Street
{
get { return _street; }
set { _street = value; }
}
public string City
{
get { return _city; }
set { _city = value; }
}
}
}
//use proxy for dramatic change to class display without changing the class
[DebuggerDisplay("{_lastname}, {_firstname}")]
// [DebuggerTypeProxy(typeof(EmployeeProxyView))]
public class EmployeeClassFancy
{
//hide this from the class view
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string _firstname;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string _lastname;
//hide root: (address) and make children (street,city,state) on level of root
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private AddressClass _address;
public EmployeeClassFancy(string firstname, string lastname, string street, string city)
{
_firstname = firstname;
_lastname = lastname;
_address = new AddressClass(street, city);
//sales = new DataTable();
//products = new DataTable();
//GetData(ref sales, ref products);
}
public string FirstName
{
get { return _firstname; }
set { _firstname = value; }
}
public string LastName
{
get { return _lastname; }
set { _lastname = value; }
}
[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]
public AddressClass Address
{
get { return _address; }
}
public class AddressClass
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string _street;
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string _city;
public AddressClass(string street, string city)
{
_street = street;
_city = city;
}
public string Street
{
get { return _street; }
set { _street = value; }
}
public string City
{
get { return _city; }
set { _city = value; }
}
}
}
//proxy for debug view of employee class
class EmployeeProxyView
{
private EmployeeClassFancy emp;
public EmployeeProxyView(EmployeeClassFancy EMP)
{ this.emp = EMP; }
public string Name
{
get { return emp.FirstName + " " + emp.LastName; }
}
}
public class DebuggerAttributes
{
static void Main()
{
EmployeeListPlain eP = new EmployeeListPlain();
eP.BuildEmployeeList();
EmployeeListFancy eF = new EmployeeListFancy();
eF.BuildEmployeeList();
}
}
public class EmployeeListPlain
{
List emps;
public void BuildEmployeeList()
{
emps = new List();
emps.Add(new EmployeeClassPlain("Julie", "Lerman", "Main Rd", "Treeville"));
emps.Add(new EmployeeClassPlain("Calvin", "Coolidge", "River Rd", "Fairfield"));
emps.Add(new EmployeeClassPlain("Jim", "Jeffords", "College Street", "Burlington"));
}
}
[System.Diagnostics.DebuggerDisplay("Employee List")]
public class EmployeeListFancy
{
//nicer view of the list in debugger
[System.Diagnostics.DebuggerDisplay("# Employees: {emps.Count}")]
List emps;
public void BuildEmployeeList()
{
emps = new List();
emps.Add(new EmployeeClassFancy("Julie", "Lerman", "Main Rd", "Treeville"));
emps.Add(new EmployeeClassFancy("Calvin", "Coolidge", "River Rd", "VT"));
emps.Add(new EmployeeClassFancy("Jim", "Jeffords", "College Street", "Burlington"));
}
}
}