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}
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
.
Is it somehow possible to access the DebuggerDisplay
attribute of a member inside the DebuggerDisplay
attribute of a "has-a" composited class?
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();
}
}
}
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();
}
}
}