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

erwartet, dass es keine Rolle spielt, welche Methode I in der Verwendung DebuggerDisplay Attribut (DDBpp1 oder DDBpp2). Wertspalte unter Debugger wird immer mit {byte [2]} gefüllt. Ich erwartete Zeichenfolge "DDBpp" für DDBpp1() -Methode oder kurzen Wert für DDBpp2() -Methode. Das Problem tritt unter VS15/17 Community auf.DebuggerDisplay keine Feldwert anzuzeigen, wie

Ist es möglich, Anzeigefeldwert unter Debugger zu ändern?

+0

Wie bereits in einer Antwort erläutert, sollte das Attribut zur Klasse gehen. Wenn Sie es für ein Mitglied benötigen, sollte Ihr Mitglied selbst eine Klasse sein. Wenn die Daten zu komplex sind, um angezeigt zu werden, macht Ihre Klasse wahrscheinlich selbst zu viel Arbeit. – Phil1970

Antwort

2

Wenn Sie [DebuggerDisplay("{DDBpp2()}")] auf die Klasse setzen sich, wird es die bytes[] Anzeige verschoben int16 Inhalt im Debugger - für die Klasse:

DebuggerDisplayAttribute on class

Es macht keinen Unterschied, ob Sie Bpp als Mitglied oder Eigenschaft implementieren und ihm mehr Attribute zu geben, hilft auch nicht.

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

Vielleicht liegt es an der Klasse setzen hilft Ihnen aus:

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

Wenn Sie einen genauen Blick auf die gegebenen Beispiele auf der MSDN-Dokumentation haben, werden Sie sehen, dass das Attribut immer nur angewendet wird, auf Klassenebene - ich bin allerdings ratlos, warum sie das Attribut dann nicht auf Klassen beschränkt haben.

Ich schaute auf die source of debuggerDisplayAttribute.cs - es ist anwendbar auf mehr als Klassen und Sie können sogar mehrere Male verwenden.

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

Mein erraten wäre, dass VS nicht alle möglichen Ergebnisse auf Mitglieder/Eigenschaften/etc nicht implementiert. für die IDE und deshalb funktioniert es nicht. Wenn Sie das Attribut mehrmals angeben, wird nur die erste in der Debugger-Ansicht verwendet: siehe mein Beispiel und debugg es.

+0

Vielen Dank für Ihre Vorschläge! Leider löst Ihre Lösung mein Problem nicht :(, da ich viele andere Felder habe, kann ich sie nicht auf Klassenebene anzeigen. Meine Problemumgehung ist das Erstellen der Eigenschaft DDBpp {get {(...) return result; }} und blättern Sie dann zu dieser Eigenschaft statt zum Feld (während des Debuggens) – ael

+0

@ael Sie könnten das "Feedback senden" in VS verwenden, um sich zu beschweren/ein Problem zu melden - vielleicht wird es in 17.9.99 behoben nicht viele Requisiten, die man an die Klasse ketten könnte, indem man alle addiert (multiple {} wird ausgewertet und die kombinierte Zeichenkette wird im Debugger angezeigt: '[DebuggerDisplay (" {CDBpp2()} {DDBpp2()} usw. etc) "]] 'gibt sie alle auf der Klasse –

2

Haben Sie überprüft:

„Wenn die Karte rohe Struktur von Objekten in Variablen Fenster das Kontrollkästchen im Werkzeugdialogfeld Optionen ausgewählt wird, dann wird das DebuggerDisplay Attribut wird ignoriert“

+0

Checked, dass auf meinem VS und ich hatte es deaktiviert, so sollte es das Attribut zu beachten. + 1 für den Hinweis, könnte für einen späteren Besucher eingestellt werden. –

+0

@Olaf, ich habe das Kontrollkästchen deaktiviert, unter VS2017 auch. – ael