debuggerdisplay не отображает значение поля, как ожидалось

public class A
{
    [DebuggerDisplay("{DDBpp1()}")]
    public byte[] Bpp = new byte[2];

    public string DDBpp1()
    {
        return "DDBpp";
    }

    public string DDBpp2()
    {
        short result;

        if (BitConverter.IsLittleEndian)
        {
            var bppCopy = new byte[2];
            Bpp.CopyTo(bppCopy, 0);
            Array.Reverse(bppCopy);
            result = BitConverter.ToInt16(bppCopy, 0);
        }
        else
        {
            result = BitConverter.ToInt16(Bpp, 0);
        }

        return result.ToString();
    }
}

Неважно, какой метод я использую в DebuggerDisplay атрибут (DDBpp1 или DDBpp2). Столбец значения в отладчике всегда заполняется {byte[2]}. Я ожидал строку "DDBpp" для метода DDBpp1() или короткое значение для метода DDBpp2(). Эта проблема появляется под VS15/17 сообщества.

Можно ли изменить значение отображаемого поля в отладчике?

2 ответа

Если вы положите [DebuggerDisplay("{DDBpp2()}")] на самом классе, он будет отображать bytes[] сдвиг содержимого int16 в отладчике - для класса:

DebuggerDisplayAttribute для класса

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

    [DebuggerDisplay("{DDBpp2()}", Name = "{DDBpp2()}", TargetTypeName = "{DDBpp2()}", Type = "{DDBpp2()}"]
    public byte[] Bpp { get; set; } = new byte[2];

Возможно, это поможет вам:

[DebuggerDisplay("{CDBpp2()}")]
[DebuggerDisplay("{DDBpp2()}")]
public class A
{
    [DebuggerDisplay("{DDBpp2()}", Name = "{DDBpp2()}", TargetTypeName = "{DDBpp2()}", Type = "{DDBpp2()}")]
    public byte[] Bpp { get; set; } = new byte[2] { 255, 255 };

    public byte[] Cpp { get; set; } = new byte[2] { 11, 28 };

    public string CDBpp2() => ToDebugStr(Cpp);

    public string DDBpp2() => ToDebugStr(Bpp);

    string ToDebugStr(byte[] b)
    {
        short result;
        if (BitConverter.IsLittleEndian)
        {
            var bppCopy = new byte[2];
            b.CopyTo(bppCopy, 0);
            Array.Reverse(bppCopy);
            result = BitConverter.ToInt16(bppCopy, 0);
        }
        else
        {
            result = BitConverter.ToInt16(b, 0);
        }
        return result.ToString();
    }
}

Если вы внимательно посмотрите на приведенные примеры в документации по msdn, вы увидите, что атрибут когда-либо применяется только на уровне классов - хотя я в тупике, почему они тогда не ограничивали атрибут классами.

Я взглянул на источник debuggerDisplayAttribute.cs - он применим более чем к классам, и вы даже можете использовать его несколько раз.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Delegate | AttributeTargets.Enum | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Assembly, AllowMultiple = true)]

Я думаю, что VS не реализует все возможные результаты для членов / свойств / и т.д. для IDE и вот почему это не работает. Если вы указываете атрибут несколько раз, в представлении отладчика используется только первое: посмотрите мой пример и отладьте его.

Вы проверили:

"Если флажок" Показать исходную структуру объектов в окнах переменных "установлен в диалоговом окне" Параметры инструментов ", то атрибут DebuggerDisplay игнорируется"

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