С https://blogs.msdn.microsoft.com/jaredpar/2011/03/18/debuggerdisplay-attribute-best-practices/ (я добавил директивы условной компиляции)
#if DEBUG
[DebuggerDisplay("{DebuggerDisplay}")]
public sealed class Student {
public string FirstName { get; set; }
public string LastName { get; set; }
private string DebuggerDisplay {
get { return string.Format("Student: {0} {1}", FirstName, LastName);}
}
}
#endif
Это похоже на ответ Микки Перлштейна (clear Свойство, которое форматирует строку отладчика) безнеобходимость переопределить ToString () (что может понадобиться для других целей.)
* source также имеет ряд других полезных советов для DebuggerDisplay, включая некоторые соображения производительности.
Редактировать
Так как в любом случае это отладочный код, нарушать ООП (доступ к частной собственности извне) не так уж и плохо ... но мы довольно сильно его нарушаемздесь трудно.
private string DebuggerString {
get {
StringBuilder sb = new StringBuilder();
sb.Append("Whatever you want your Parent class' Debugger Text To Say");
var properties = typeof(GroupQuote).GetProperties()
//get the properties with the DebuggerDisplay attribute and our property
.Where(x = > x.PropertyType.IsDefined(typeof(DebuggerDisplayAttribute))
&& x.PropertyType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance).Any(y = > y.Name == "DebuggerString"));
foreach(PropertyInfo property in properties) {
object itemWithProperty = property.GetValue(this);
//we have to check our property for null, otherwise trying to get its DebuggerString property will throw an exception
if (itemWithProperty != null) {
PropertyInfo privateDebuggerProperty = property.PropertyType.GetProperty("DebuggerString", BindingFlags.NonPublic | BindingFlags.Instance);
sb.Append(privateDebuggerProperty.GetValue(itemWithProperty)as string);
}
}
return sb.ToString();
}
}
В коде, который я написал и протестировал, у меня были некоторые свойства моего класса Parent, показывающие, что DebuggerDisplay был определенкогда это не было (возможно, вещь наследства?).Я добавил дополнительную проверку, чтобы мы искали DebuggerString только в тех свойствах, у которых она есть.