属性存在于调试器中,但在编译时不存在
Posted
技术标签:
【中文标题】属性存在于调试器中,但在编译时不存在【英文标题】:Property exists in debugger but not when compiling 【发布时间】:2015-12-11 10:18:11 【问题描述】:上下文:我需要检查一个窗口是否在显示之前被释放(如果有一些其他代码称为 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”的定义,并且没有可以找到接受“Stw.Tools.Zugriffsrechteantrag.Windows.UserWindow”类型的第一个参数的扩展方法“IsDisposed” (您是否缺少 using 指令或程序集引用?)。
我尝试添加对System.Windows.Forms
的引用,因为表单窗口包含IsDisposed
属性,但这并没有使代码编译成功。
问题:如何在调试器中访问公共属性但在代码中无法访问?
【问题讨论】:
不确定您所说的“在窗口底部”是什么意思,但您能否附上一张显示此公共财产的屏幕截图? (请注意,添加与 Windows 窗体有关的任何内容都不会改变 WPF 中可用的内容...) @JonSkeet 我添加了截图,希望上传没有被我公司屏蔽 好吧,这不是公开的——根据我的回答,它是内部的。 【参考方案1】:问题:如何在调试器中访问属性但在代码中无法访问?
因为调试器基本上可以显示您的代码无权访问的私有、内部和受保护成员。您可以自己查看 - 只需声明一个私有字段,您就会在调试器中看到该字段,但即使在同一个项目中,您也无法从其他类访问它。
在本例中,属性为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
实例时,我将其视为内部实例,如下所示:
【讨论】:
以上是关于属性存在于调试器中,但在编译时不存在的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2008 在编译模板时不关心基类的存在?
使用发布 CRT 在调试中构建应用程序,但在 boost 上存在依赖问题