7

DebuggerDisplayAttributeで装飾されたクラスがいくつかあります。

これらのクラスのインスタンスを表示する単体テストにトレースステートメントを追加できるようにしたいと思います。

DebuggerDisplayAttributeを使用してフォーマットされたオブジェクトを表示する(または、DebuggerDisplayAttributeが定義されていない場合は.ToString()の使用にフォールバックする)メソッドが.NET Frameworkに存在しますか?

編集

明確にするために、私はフレームワークに何かが組み込まれているのではないかと期待していました。DebuggerDisplayAttributeからValueプロパティを取得できることはわかっていますが、DebuggerDisplayAttribute.Valueで表されるフォーマット文字列を使用してインスタンスをフォーマットする必要があります。

私が自分自身を転がす場合、私は次の線に沿った拡張方法を想像します:

public string FormatDebugDisplay(this object value)
{
    DebugDisplayAttribute attribute = ... get the attribute for value ...
    if (attribute = null) return value.ToString();

    string formatString = attribute.Value;

    ??? How do I format value using formatString ???
    return SomeFormatMethod(formatString, value);
}
4

3 に答える 3

3

これは良いことかもしれませんが、DebuggerDisplayAttributeのフォーマット文字列は、ウォッチウィンドウまたはイミディエイトウィンドウに入力した式を評価するのと同じ方法で、デバッガーによって評価されます。そのため、中括弧内に。のように任意の式を入れることができます{FirstName + " " + LastName}

したがって、コードでこれらを評価するには、VisualStudioデバッガーをアプリに埋め込む必要があります。おそらく起こらないでしょう。(ニヤリ)

最善の策は、現在DebuggerDisplayフォーマット文字列にあるすべてのフォーマットロジックを取得し、代わりにメソッドにすることです。次に、コードからそのメソッドを自由に呼び出すことができます。DebuggerDisplay属性は、メソッドを呼び出す以外に何もしません。

[DebuggerDisplay("{Inspect()}")]
public class MyClass {
    public string Inspect() { ... }
}
于 2010-08-24T16:38:03.757 に答える
2

このメソッドは、DebuggerDisplayAttributeがデバッガーで提供するものを正確に実装しませんが、これは私のコードで使用しているものです。これは、コードベースで発生するケースの約90%(またはそれ以上)をカバーしています。さらに多くのケースをカバーするように修正した場合は、機能強化を確認したいと思います。

    public static string ToDebuggerString(this object @this)
    {
        var display = @this.GetType().GetCustomAttributes(typeof (DebuggerDisplayAttribute),false).FirstOrDefault() as DebuggerDisplayAttribute;
        if (display == null)
            return @this.ToString();

        var format = display.Value;
        var builder = new StringBuilder();
        for (var index = 0; index < format.Length; index++)
        {
            if (format[index] == '{')
            {
                var close = format.IndexOf('}', index);
                if (close > index)
                {
                    index++;
                    var name = format.Substring(index, close - index);
                    var property = @this.GetType().GetProperty(name);
                    if (property != null)
                    {
                        var value = property.GetValue(@this, null).ToString();
                        builder.Append(value);
                        index += name.Length;
                    }
                }
            }
            else
                builder.Append(format[index]);
        }
        return builder.ToString();
    }
于 2015-10-30T21:04:11.380 に答える
1

DebuggerDisplayAttributeには、必要なものを返すValueプロパティがあります。

したがって、おそらく次のようなものを使用できます。

var attribute = obj.GetType().
    GetCustomAttributes(typeof(DebuggerDisplayAttribute), false);
return (attribute == null) ? obj.ToString() : attribute.Value;

これを拡張メソッドに入れることもできます。

public static string ToDebugString(this object obj)
{
    var attribute = obj.GetType().
        GetCustomAttributes(typeof(DebuggerDisplayAttribute), false);
    return (attribute == null) ? obj.ToString() : attribute.Value;
}

すべてのオブジェクトで呼び出すことができます。myObject.ToDebugString()

于 2010-05-08T12:10:50.227 に答える