3

かなりばかげた質問ですが、私は単に答えを見つけることができません。

インターフェイスを実装する自己記述クラスがありIList<T>ます。今、私は .Net の場合と同じように、デバッグ内に含まれている要素を見たいと思っていますList<T>

これを機能させるには、 内で正しいビジュアライザーを提供する必要があると思いますDebuggerVisualizerAttribute。少し検索した後、追加の Visualizer のフォルダーが見つかりました。ただし、DataSet には 1 つしかありません。

しかし、Visual Studio 内で既に利用可能なすべてのビジュアライザー (文字列、リストなど) の型は何ですか?

4

4 に答える 4

4

.NET フレームワーク クラスで使用されるデバッガー ビジュアライザーは内部的なものです。typeof() を使用することはできません。ただし、バックドアがあります。[DebuggerTypeProxy] 属性には、文字列を受け入れるコンストラクターもあります。使用するものは Mscorlib_CollectionDebugView という名前で、ICollection<> を実装する任意のクラスを視覚化できます。使用例を次に示します。

[DebuggerTypeProxy("System.Collections.Generic.Mscorlib_CollectionDebugView`1, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
class MyCollection<T> : IList<T> {
    private List<T> impl = new List<T>();
    public int IndexOf(T item) {  return impl.IndexOf(item); }
    public void Insert(int index, T item) { impl.Insert(index, item); }
    public void RemoveAt(int index) { impl.RemoveAt(index); }
    public T this[int index] {
        get { return impl[index]; }
        set { impl[index] = value; }
    }
    public void Add(T item) { impl.Add(item); }
    public void Clear() { impl.Clear(); }
    public bool Contains(T item) { return impl.Contains(item); }
    public void CopyTo(T[] array, int arrayIndex) { impl.CopyTo(array, arrayIndex); }
    public int Count { get { return impl.Count; }}
    public bool IsReadOnly { get { return ((System.Collections.IList)impl).IsReadOnly; }}
    public bool Remove(T item) { return impl.Remove(item); }
    public IEnumerator<T> GetEnumerator() { return impl.GetEnumerator(); }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); }
}

バージョン番号が間違っていても、これは.NET 4.0でも機能します。そうしないと、内部クラスの名前を変更することにした場合、.NET の次のバージョンで壊れるリスクがあります。

于 2011-02-03T14:48:56.943 に答える
2

List<T>を使用してDebuggerTypeProxyAttribute、デバッガーのプロキシを定義します。次の式を使用してすべてを見つけることができます。

var types =
    from assembly in AppDomain.CurrentDomain.GetAssemblies()
    from type in assembly.GetTypes()
    from attribute in type.GetCustomAttributes(typeof(DebuggerTypeProxyAttribute), true)
    select ((DebuggerTypeProxyAttribute)attribute).ProxyTypeName;

上記の式を使用して、をテストすることもできますがDebuggerVisualizerAttribute、結果はゼロになります(おそらく、特定のフォルダー内のアセンブリが参照されていないためです)。フォルダ内のアセンブリを参照する場合は、上記の式を使用して、そこで実装を見つけることができます。

于 2011-02-03T13:56:59.403 に答える
2

独自のリスト デバッガーを作成する方法については、次のような優れた記事があります。

http://www.codeproject.com/KB/debug/DebugIList.aspx

于 2011-11-19T20:08:36.873 に答える
0

System.Diagnostics.DebuggerVisualizerAttribute引数にビジュアライザーのタイプを使用して、クラスに属性を追加できます

于 2011-02-03T13:45:34.253 に答える