Использование методов расширения в атрибуте [DebuggerDisplay]

Атрибут [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 (), но это помогает только для моих собственных типов.

3 ответа

Решение

Короче нет. По тем же причинам, по которым методы расширения не работают dynamicТо есть, что только из имени метода, нет способа узнать, что using Директивы были в силе, и, следовательно, какие методы расширения являются кандидатами. Вполне возможно иметь сценарии, в которых используются разные using директивы изменяют доступные методы, поэтому нет смысла пытаться угадать.

Вам придется ограничиться обычными методами, если только строка не позволяет явно указывать статические методы для классов, т.е. DbgDisp.Ext.ShortName(foo),

На самом деле вы можете использовать методы расширения, передавая это в качестве аргумента

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

Вы можете поместить приватный метод в ваш класс, который использует метод расширения, который вы хотите сгенерировать. DebuggerDisplay Атрибут может ссылаться на этот метод.

Другие вопросы по тегам