2009-08-19 27 views
4

この属性はC#で動作するはずですが、私の場合はそうではありません。 私はレイジープロパティの子を持つクラスを持っています。このプロパティにアクセスすると、サーバーへのラウンドトリップの副作用が生じる可能性があります。だから当然、私はデバッガのウォッチウィンドウでそれを見るだけで、これが起こらないようにしています。DebuggerDisplay属性が期待通りに機能しません。

[DebuggerDisplay("(Frozen) {m_children}")] 
public IList<IEntityBase> Children 
{ 
    get 
    { 
    if (m_children == null) 
    { 
     m_children = FetchChildrenFromDB(this); 
    } 
    return m_children; 
    } 
} 

そして、まだ、私はオブジェクトを見て、私は意味、表示中(冷凍)に表示されていないウォッチウィンドウでthisを展開したとき:ソースはかなり普通に見えるすべての無関係な細部を省略

デバッガは単に属性を無視します。画像リンクを提供

は、それが下に表示する必要があり、まだ有効です。 http://i28.tinypic.com/2zxo9s5.jpg DebuggerDisplay image snapshot http://i28.tinypic.com/2zxo9s5.jpg

属性がリフレクターによると、実際にそこにあります。私はVS2008を使用します。

アイデア?

+0

誤って独自のDebuggerDisplay属性を導入していないことを確認しましたか?おそらくデバッグの問題がありますか? –

+0

これがORM実装の一部である場合、観測可能なプロパティを実装するために、ORMフレームワークが実際のオブジェクトの周りにシムレイヤを作成している可能性がありますか?私はこれらのことが起こったのを見ました。その場合、オブジェクトのタイプがあなたのソースコードと一致しません。あなたはあなたがソースコードで持っている正確なタイプを見ていることを確認できますか? –

+0

コードはクライアント側のコードです。 ORMはその側で使用されません。私たちはサーバー側でNHibernateを使用しますが、クライアント側はそれから完全に切り離されています。私はそれがシムではないと確信しています。 – mark

答えて

0

まあ、私はそれをテストして、私の簡単なプログラムで動作します。私は可能性のある説明があるとも思ったが、テストはそれが私が思ったものではないことを示している(コードの下の情報)。

まず、ここで動作するコードは次のとおりです。

using System; 
using System.Diagnostics; 
using System.Collections.Generic; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      Console.Out.WriteLine(p.Name); // breakpoint here 
     } 

     private String _Name = String.Empty; 
     [DebuggerDisplay("Name: {_Name}")] 
     public String Name 
     { 
      get { return _Name; } 
      set { _Name = value; } 
     } 

     private IList<String> _Names = new List<String>(); 
     [DebuggerDisplay("Names: {_Names.Count}")] 
     public IList<String> Names 
     { 
      get { return _Names; } 
      set { _Names = value; } 
     } 
    } 
} 

私はあなたがFetchChildrenFromDBメソッドから取得するコレクションクラスは、それに接続されている独自のDebuggerDisplay属性を持っていた、そしてそれは優先順位を取ったということだと思った何を。しかしそれはそうではありません。私はその属性がアタッチされたダミーのIListクラスを実装しました。プロパティにアタッチされているクラスも引き続き優先されました。

+0

私はDebuggerDisplayがうまくいくはずです。だから私は困惑している。明らかに私の怠惰な財産のために働かない。 – mark

0

括弧「(凍結)」が原因である可能性があります。
"Frozen"に変更します(テキストの場合)。

ところで、 "Frozen"とは何ですか?それは単純なテキストか既存のプロパティですか?
EDIT:これはMSDNのサンプルコードに基づいて推測したものです& Lasseのコード。

+0

凍結は、その属性が機能することを知らせるための単なる言葉です。あなたはそれを他の言葉と置き換えることができ、大括弧を省略することができます。何も役立ちません。 – mark

5

あなたはの線に沿って何かあなたのウォッチウィンドウに表示される場合:

[+] ObjectName | { namespace.object} 

「ツール - >オプション - >デバッグ:>一般 - >変数ウィンドウ内のオブジェクトの生の構造を表示する」ことを確認してくださいはチェックされません。

私はこれをクリアしたら、私のDebuggerDisplay属性が(...すべての「WTF」さんと 『はぁ』「私は追加のだSを示す含めて)正しく表示

0

あなたは、クラスにDebuggerDisplayAttributeを置く必要がありますはインスタンスフィールドであり、プロパティコンテキストで評価することができないため、プロパティではありません。

プロパティ表示は、デバッガプロキシがないため、常に評価されます。

関連する問題