Search code examples
c#.netvisual-studiodebuggingdebuggerdisplay

Possible to accessing child "DebuggerDisplay" attribute of property?


Current state

Having two classes:

[DebuggerDisplay(@"One = {One}, two = {Two}")]
public class A
{
    public int One { get; set; }
    public B Two { get; set; }
}

[DebuggerDisplay(@"Three = {Three}")]
public class B
{
    public int Three { get; set; }
}

Using them:

var a = new A {One = 5, Two = new B {Three = 10}};

Inside the debugger, the tool tip value that is displayed at a is

One = 5, two = {DebuggerDisplayTest.B}

Goal

What I would want is something like

One = 5, two = 'Three = 10'

I know this could be achieved by overriding the ToString() method of class B. This just feels not right, since I'm writing code in my application for debugging only.

I also know that using a string similar to

[DebuggerDisplay(@"One = {One}, two = 'Three = {Two.Three}'")]

would work, too. This also does not feel right to me, since it would require that class A has knowledge of class B.

I would like to have more of a way to "inject" the value of DebuggerDisplay of type B to the instance of that type in class A.

Question

Is it somehow possible to access the DebuggerDisplay attribute of a member inside the DebuggerDisplay attribute of a "has-a" composited class?

Update

Probably, my requirement is not possible as per this SO answer. Maybe a good solution would be to override ToString in class B and do some if..else and use the Debugger.IsAttached property to behave different only inside the debugger.

Something like:

[DebuggerDisplay(@"Three = {Three}")]
public class B
{
    public int Three { get; set; }

    public override string ToString()
    {
        if (Debugger.IsAttached)
        {
            return string.Format(@"Three = {0}", Three);
        }
        else
        {
            return base.ToString();
        }
    }
}

Solution

  • Copied possible solution from OP

    Probably, my requirement is not possible as per this SO answer. Maybe a good solution would be to override ToString in class B and do some if..else and use the Debugger.IsAttached property to behave different only inside the debugger.

    Something like:

    [DebuggerDisplay(@"Three = {Three}")]
    public class B
    {
        public int Three { get; set; }
    
        public override string ToString()
        {
            if (Debugger.IsAttached)
            {
                return string.Format(@"Three = {0}", Three);
            }
            else
            {
                return base.ToString();
            }
        }
    }