属性存在于调试器中,但在编译时不存在

时间:2015-12-11 10:18:11

标签: c# wpf visual-studio-2013 window

上下文:我需要检查一个窗口是否在显示之前被放置(如果其他一些代码叫做App.Shutdown)。 How do you tell if a WPF Window is closed?中给出的解决方案不起作用,因为IsLoaded当时仍然是假的。

让我困惑的是什么
在尝试显示WPF窗口之前设置断点时,我可以访问窗口底部的IsDisposed属性,window.IsDisposed也可以。但是,当我尝试在代码中使用window.IsDisposed时,它无法编译。

调试器的屏幕截图: IsDisposed-Property inside base of window

错误讯息:

  

'Stw.Tools.Zugriffsrechteantrag.Windows.UserWindow'不包含'IsDisposed'的定义,并且没有扩展方法'IsDisposed'接受类型'Stw.Tools.Zugriffsrechteantrag.Windows.UserWindow'的第一个参数可以找到(您是否缺少using指令或程序集引用?)。

我尝试添加对System.Windows.Forms的引用,因为Forms窗口包含IsDisposed属性,但没有使代码编译成功。

问题:如何在调试器中访问公共属性,而不是在代码中访问?

1 个答案:

答案 0 :(得分:4)

  

问题:如何在调试器中访问属性,而不是在代码中访问?

因为调试器可以显示代码无法访问的私有,内部和受保护成员,基本上。您可以自己看到这一点 - 只需声明一个私有字段,您就会在调试器中看到该字段,但即使在同一个项目中,您也无法从其他类访问它。

在这种情况下,属性为internal,如下所示:

using System;
using System.Reflection;

class Test
{
    static void Main()
    {
        var type = typeof(System.Windows.Window);
        var property = type.GetProperty("IsDisposed", BindingFlags.Instance | BindingFlags.NonPublic);
        foreach (var accessor in property.GetAccessors(nonPublic: true))
        {
            Console.WriteLine($"{accessor.Name}: {accessor.Attributes}");
        }
    }
}

输出:

get_IsDisposed: PrivateScope, Assembly, HideBySig, SpecialName

我不确定为什么调试器会向你显示它就好像它是公开的 - 当我创建一个Window实例时,我将其视为内部,如下所示:

Debugger screenshot