簡體   English   中英

在[DebuggerDisplay]屬性中使用擴展方法

[英]Using extension methods in [DebuggerDisplay] Attribute

Attribute [DebuggerDisplay]( 使用DebuggerDisplayAttribute )允許在VS 2010/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 () ,但這只對我自己的類型有幫助。

實際上你可以使用傳遞它的擴展方法作為參數

[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();
    }    
}

簡而言之,沒有。 出於同樣的原因,擴展方法不能用於dynamic ,即僅從方法名稱開始,沒有辦法知道using指令有效,因此哪些擴展方法是候選。 完全有可能使用不同的using指令更改可用方法的場景,因此嘗試猜測沒有任何好處。

除非字符串允許您明確地在類上指定靜態方法,即DbgDisp.Ext.ShortName(foo) ,否則您必須將自己限制為常規方法。

您可以在類中放置一個私有方法,該方法使用您想要生成字符串的擴展方法。 然后, DebuggerDisplay屬性可以引用該方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM