2009-08-19 178 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属性,可能是因为某些调试问题? – 2009-08-19 19:42:37

+0

如果这是某些ORM实现的一部分,ORM框架是否可以创建围绕实际对象的填充层来实现可观察属性?我已经看到了这些事情发生,在这种情况下,对象的类型与您的源代码不匹配。你能否检查一下你在源代码中的确切类型? – 2009-08-19 19:47:11

+0

该代码是客户端代码。在那边没有使用ORM。我们在服务器端使用NHibernate,但客户端完全脱离它。我相信这不是一个垫脚石。 – mark 2009-08-19 20:09:42

回答

0

那么,我只是测试它,它适用于我的简单程序。我也认为我有一个可能的解释,但测试表明,这不是我想的(info下面的代码)。

首先,这里是工作的代码:

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 2009-08-19 20:00:14

0

我想,这可能是由于括号“(Frozen)”。
如果是文本,请将其更改为“冻结”。

顺便说一句,什么是“冷冻”?它是简单的文本还是现有的属性?
编辑:这是我猜根据MSDN & Lasse的代码上的示例代码。

+0

冻结只是一个让我知道该属性起作用的词。你可以用任何其他词来代替它,省略括号,不管。没什么帮助。 – mark 2009-08-19 20:05:06

5

如果你看到在你的手表窗口的东西沿着线:

[+] ObjectName | { namespace.object} 

确保“工具 - >选项 - > Debugging->常规 - >显示变量窗口对象的原始结构”未被选中。

一旦我清除了,我的显示属性DebuggerDisplay正确(包括显示所有的“跆拳道”的和‘啊’的会加我...)

0

你应该把DebuggerDisplayAttribute的类而不是属性,因为是一个实例字段,无法在属性上下文中进行评估。

属性显示总是按原样进行评估,因为它没有调试器代理。