繁体   English   中英

常见的 DebuggerDisplay 属性实现

[英]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()}}")]

我的问题是:

  1. 是否有任何现有的扩展来生成DebuggerDisplay字符串? 内置的 VS 实现只是添加了返回 ToString() 的方法,这并没有真正的帮助
  2. 我可以以某种编译器检查的方式调用该方法,而不是作为字符串吗? “这个。” 显然在属性 arguments 中不可用。 可能有什么表情?
  3. 还有其他可能的解决方案吗?

您是否尝试过在扩展方法中再次使用“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM