2017-01-20 17 views
5

C#コードをデバッグする際のVisual Studio 2015(および一部の古いバージョン)では、虫めがねのアイコン付きのドロップダウンリストを使用して、さまざまなビジュアライザ(テキスト、XML、HTML、JSON)にstring変数の値を表示できます。これは、一部の非文字列型(たとえば、System.Xml.Linq.XElement)でも有効です。これらのビルトインビジュアライザを使用して、自分のカスタムタイプの変数の値を表示できますか?Visual Studio Text Visualizerをカスタムタイプに使用するには?

コンテキスト:

私はすぐに許容できるだけ複数行テキスト環境で可視化することができる複雑なカスタム型の状態を確認できるようにする必要があります。

+0

おそらく、[デバッガディスプレイプロキシ](https://msdn.microsoft.com/en-us/library/d8eyd8zc.aspx)が役立つ可能性がありますか? –

答えて

3

私があなたの質問を正しく理解すれば、あなたはあなたのものを達成することができますその後はDebuggerTypeProxyとなります。複雑な型のオブジェクトを検査しているときはいつでも、デバッガはプロキシオブジェクトを作成して表示します。

下の例では、プロキシオブジェクトにはテキストビジュアライザで表示できる(複数行の)文字列プロパティが含まれています。それでも基本となるオブジェクト自体を見る必要がある場合は、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

はい、それはまさに私が達成しようとしていることです。 1回の余分なクリックはちょっと迷惑ですが、私はそれで暮らすことができます。私のSystem.Xml.Linq.XElementの動作には理想的でしたが、私はいくつかの希望がありましたが、そのタイプはテキストのようなビジュアライザーに何らかの形でハードコードされていたと思います。 – user98418468459

0

はいできます。選択肢の一つは、DebuggerDisplayAttribute

デバッガ表示属性を指定し、最高のは、そのタイプの実行時の動作を理解するタイプの開発者は、また、それはAに表示されている場合、そのタイプがどのように見えるかを指定することができます使用することですデバッガ。

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

編集:私はあなたが望むものを理解し説明した後。あなたのカスタム複数行のビジュアライザを行うことが可能ですが、あなたはおそらくそれを行う方法が好きではありません:)

  1. あなたはMicrosoft.VisualStudio.DebuggerVisualizers.dllへの参照を追加する必要があります。 Add Reference - > Assemblies - > Extensionsリストで見つけました
  2. 新しいクラスを作成し、DialogDebuggerVisualizerクラスを継承する必要があります。 Showメソッドをオーバーライドし、必要なコンテンツを表示します。 Serializible
  3. として
  4. マーク、あなたのクラスは、ここでは、カスタムビジュアライザへ

を参照を追加するサンプルコードです:

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

次にあなたが拡大鏡が表示され、あなたがそれをクリックすると結果が見えますこのように: enter image description here

+0

値を1行に表示するには - はい。複数行(目に見える複数行) - いいえ。 – user98418468459

+0

ああ、あなたが話していることを理解するのに時間がかかりました:D – Reniuz

+0

@ user98418468459答えを編集しました。お楽しみください:) – Reniuz

関連する問題