上下文:我需要检查一个窗口是否在显示之前被放置(如果其他一些代码叫做App.Shutdown)。 How do you tell if a WPF Window is closed?中给出的解决方案不起作用,因为IsLoaded
当时仍然是假的。
让我困惑的是什么:
在尝试显示WPF窗口之前设置断点时,我可以访问窗口底部的IsDisposed
属性,window.IsDisposed
也可以。但是,当我尝试在代码中使用window.IsDisposed
时,它无法编译。
错误讯息:
'Stw.Tools.Zugriffsrechteantrag.Windows.UserWindow'不包含'IsDisposed'的定义,并且没有扩展方法'IsDisposed'接受类型'Stw.Tools.Zugriffsrechteantrag.Windows.UserWindow'的第一个参数可以找到(您是否缺少using指令或程序集引用?)。
我尝试添加对System.Windows.Forms
的引用,因为Forms窗口包含IsDisposed
属性,但没有使代码编译成功。
问题:如何在调试器中访问公共属性,而不是在代码中访问?
答案 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
实例时,我将其视为内部,如下所示: