9

属性[DebuggerDisplay](DebuggerDisplayAttributeを使用)を使用すると、VS2010/2008のデバッガーで表示を定義できます。AutoExp.cs / .dllを変更することで、システムタイプやサードパーティタイプの表示を上書きすることもできます。

[assembly: DebuggerDisplay (@"\{Name = {Name} FullName = {FullName}}", Target = typeof (Type))]

内側の中括弧では、フィールド、プロパティ、およびメソッドを参照できます。拡張メソッドを参照することは可能ですか?

例として、たとえば。$SCG.Dictionaryの代わりに、より短いタイプ名を表示しようとしましたSystem.Collections.Generic.Dictionary。これをAutoExp.csに追加しました:

using DbgDisp;

[assembly: DebuggerDisplay (@"\{Name = {Name} ShortName = {ShortName()}}", Target = typeof (Type))]

namespace DbgDisp {
  public static class Ext {
    public static string ShortName (this Type t) { return string.Format ("[{0}]", t.Name); }
  } // Ext
} // DbgDisp

しかし、デバッガーは文句を言います:名前'ShortName'は現在のコンテキストに存在しません。

私は何かが足りないのですか、それともそこで拡張メソッドを使用することができないのですか?

オーバーライドできることはわかっていますToString ()が、それは自分のタイプにのみ役立ちます。

4

3 に答える 3

10

実際には、これを引数として渡す拡張メソッドを使用できます

[assembly: DebuggerDisplay(@"NetGuid = {ToString()} OracleGuid = {GuidExtensions.ToVarChar(this)}", Target = typeof(Guid))]
public static class GuidExtensions
{
    public static string ToVarChar(this Guid guid)
    {
        var newBytes = new byte[16];
        var oldBytes = guid.ToByteArray();
        for (var i = 8; i < 16; i++)
            newBytes[i] = oldBytes[i];

        newBytes[3] = oldBytes[0];
        newBytes[2] = oldBytes[1];
        newBytes[1] = oldBytes[2];
        newBytes[0] = oldBytes[3];
        newBytes[5] = oldBytes[4];
        newBytes[4] = oldBytes[5];
        newBytes[6] = oldBytes[7];
        newBytes[7] = oldBytes[6];

        return new Guid(newBytes).ToString("N").ToUpper();
    }    
}
于 2016-10-06T20:34:11.813 に答える
5

要するに、違います。拡張メソッドが機能しないのと同じ理由で、つまり、メソッド名だけdynamicから、どのディレクティブが有効であったか、したがってどの拡張メソッドが候補であるかを知る方法がありません。異なるディレクティブを使用すると使用可能なメソッドが変更されるシナリオが発生する可能性は完全にあるため、推測を試みてもメリットはありません。usingusing

文字列でクラスの静的メソッドを明示的に指定できない限り、通常のメソッドに制限する必要がありますDbgDisp.Ext.ShortName(foo)

于 2011-04-09T11:28:39.180 に答える
0

文字列を生成する拡張メソッドを使用するプライベートメソッドをクラスに配置できます。その後、DebuggerDisplay属性はそのメソッドを参照できます。

于 2014-11-20T12:26:34.217 に答える