Использование методов расширения в атрибуте [DebuggerDisplay] - PullRequest
8 голосов
/ 09 апреля 2011

Атрибут [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 ]

6 голосов
/ 06 октября 2016

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

[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();
    }    
}
4 голосов
/ 09 апреля 2011

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

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

0 голосов
/ 20 ноября 2014

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

...