[英]Common DebuggerDisplay attribute implementation
我正在尝试实现 common/general DebuggerDisplay属性,以避免为每次使用格式化它,这将简单地显示 class 的每个属性。 这就是我到目前为止所取得的成就,我的扩展方法看起来像这样
public static class DebuggerExtension
{
public static string ToDebuggerString(this object @this)
{
var builder = new StringBuilder();
foreach (var property in @this.GetType().GetProperties())
{
if (property != null)
{
var value = property.GetValue(@this, null)?.ToString();
builder.Append($"{property.Name}: {value}, ");
}
}
return builder.ToString();
}
}
我这样称呼它,它基本上可以工作:
[DebuggerDisplay($"{{this.ToDebuggerString()}}")]
我的问题是:
您是否尝试过在扩展方法中再次使用“ToDebuggerString()”而不是“ToString()”?
你可能会感兴趣。 Visual Studio 的 Natvis 调试框架教程
下面的示例可能对您有所帮助。 (它可能会丢失!)
public static class DebuggerExtension
{
public static string ToDebuggerDisplay(this object o)
{
if (object.ReferenceEquals(o, null))
return "null";
else if (o is string)
return string.Format("\"{0}\"", (string)o);
else if ((o is DateTime) || (o is TimeSpan))
return string.Format("{{{0}}}", o);
else if (o is System.Collections.ICollection)
return string.Format("{{Count={0}}}", ((System.Collections.ICollection)o).Count);
else if (o is System.Collections.IEnumerable)
{
int nCount = 0;
System.Collections.IEnumerator e = ((System.Collections.IEnumerable)o).GetEnumerator();
while (e.MoveNext())
{
nCount++;
}
return string.Format("{{Count={0}}}", nCount);
}
Type objType = o.GetType();
if (objType.IsPrimitive || objType.IsEnum)
return o.ToString();
else if (objType.IsArray)
return string.Format("{{Count={0}}}", ((Array)o).Length);
PropertyInfo[] propertyInfos = objType.GetProperties(BindingFlags.Instance
| BindingFlags.Public
| BindingFlags.GetProperty
| BindingFlags.DeclaredOnly);
string retVal = "{";
int ndx = 0;
foreach (PropertyInfo pi in propertyInfos)
{
if (!pi.CanRead)
continue;
DebuggerBrowsableAttribute attr = pi.GetCustomAttribute<DebuggerBrowsableAttribute>();
if (!object.ReferenceEquals(attr, null) && (attr.State == DebuggerBrowsableState.Never))
continue;
if (ndx++ > 0)
retVal += " ";
retVal += string.Format("{0}={1}", pi.Name, pi.GetValue(o).ToDebuggerDisplay());
if (ndx > 2)
{
retVal += " ...";
break;
}
}
retVal += "}";
return (ndx > 0) ? retVal : o.ToString();
}
}
[DebuggerDisplay(@"{this.ToDebuggerDisplay(),nq}")]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.