2017-01-20 11 views
5

W Visual Studio 2015 (oraz w niektórych starszych wersjach) podczas debugowania kodu C# możliwe jest wyświetlanie wartości zmiennych string w różnych wizualizatorach (Text, XML, HTML, JSON) za pomocą listy rozwijanej z ikoną lupy . Działa to również w przypadku niektórych typów nie-łańcuchowych, na przykład: System.Xml.Linq.XElement. Czy można używać tych wbudowanych wizualizatorów do wyświetlania wartości zmiennej mojego własnego typu niestandardowego?Jak używać Visual Studio Text Visualizer dla niestandardowych typów?

Kontekst:

muszę być w stanie szybko sprawdzić stan skomplikowanej niestandardowego typu, które mogą być wizualizowane zadowalająco tylko w środowisku tekstowymmulti-line.

+0

Może [Pokaż proxy debugger] (https://msdn.microsoft.com/en-us/library/d8eyd8zc.aspx) może być przydatna w przypadku? –

Odpowiedz

3

Jeśli dobrze rozumiem twoje pytanie, możesz osiągnąć to, co masz potem z DebuggerTypeProxy. Powoduje, że debugger tworzy i wyświetla obiekt proxy za każdym razem, gdy sprawdzasz obiekty swojego typu złożonego.

W poniższym przykładzie obiekt proxy zawiera (wielolinijkową) właściwość ciągu znaków, którą można wyświetlić za pomocą wizualizatora tekstowego. Jeśli nadal potrzebujesz spojrzeć na sam obiekt leżący pod spodem, do tego służy przycisk Raw view.

[DebuggerTypeProxy(typeof(ComplexTypeProxy))] 
class ComplexType 
{ 
    // complex state 
} 

class ComplexTypeProxy 
{ 
    public string Display 
    { 
     get { return "Create a multi-line representation of _content's complex state here."; } 
    } 

    private ComplexType _content; 

    public ComplexTypeProxy(ComplexType content) 
    { 
     _content = content; 
    } 
} 
+0

Tak, dokładnie to próbuję osiągnąć. Jedno dodatkowe kliknięcie jest nieco denerwujące, ale mogę z tym żyć. Idealne dla mnie zachowanie System.Xml.Linq.XElement dało mi trochę nadziei, ale domyślam się, że ten typ był w jakiś sposób zakodowany we wszystkich tekstowych wizualizacjach. – user98418468459

0

Tak, można. Jedną z opcji jest użycie DebuggerDisplayAttribute

atrybuty wyświetlania Debugger pozwalają deweloper typu, który określa i najlepiej rozumie zachowania wykonania tego typu, również określić, jakie tego typu będzie wyglądać, gdy jest wyświetlany w debugger.

[DebuggerDisplay("The count value in my class is: {count}")] 
class MyClass 
{ 
    public int count { get; set; } 
} 

EDIT: Po wyjaśnienie Rozumiałem, co chcesz. Jest możliwe, aby zrobić swój własny multi-liniowy wizualizer, ale prawdopodobnie nie podoba mi się sposób to zrobić :)

  1. trzeba dodać odwołanie do Microsoft.VisualStudio.DebuggerVisualizers.dll. Znalazłem go w Dodaj odniesienie -> Złożenia -> Lista rozszerzeń
  2. Twoja potrzeba stworzenia nowej klasy i dziedziczenia klasy DialogDebuggerVisualizer. Zastąp metodę Pokaż i wyświetl wymaganą zawartość.
  3. Mark klasa jako Serializible
  4. dodawania odniesienie do niestandardowego Visualizer

Oto przykładowy kod:

using System.Windows.Forms; 
using Microsoft.VisualStudio.DebuggerVisualizers; 
[assembly: DebuggerVisualizer(typeof(MyClassVisualizer), Target = typeof(MyClass), Description = "My Class Visualizer")] 

namespace MyNamespace 
{ 
    [Serializable] 
    public class MyClass 
    { 
     public int count { get; set; } = 5; 
    } 

    public class MyClassVisualizer : DialogDebuggerVisualizer 
    { 
     protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider) 
     { 
      MyClass myClass = objectProvider.GetObject() as MyClass; 

      if (objectProvider.IsObjectReplaceable && myClass != null) 
      { 
       StringBuilder sb = new StringBuilder(); 
       sb.AppendLine("Here is"); 
       sb.AppendLine("your multi line"); 
       sb.AppendLine("visualizer"); 
       sb.AppendLine($"of MyClass with count = {myClass.count}"); 

       MessageBox.Show(sb.ToString()); 
      } 
     } 
    } 
} 

Następnie pojawi się lupa i po kliknięciu go wynik będzie wyglądać tak: enter image description here

+0

Aby wyświetlić wartość w jednym wierszu - tak. Wieloliniowy (widocznie na wielu liniach) - nie. – user98418468459

+0

Ahh zajęło mi trochę czasu, aby zrozumieć, o czym mówisz: D – Reniuz

+0

@ user98418468459 Edytowałem odpowiedź.Ciesz się :) – Reniuz

Powiązane problemy