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

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 实例时,我将其视为内部实例,如下所示:

【讨论】:

以上是关于属性存在于调试器中,但在编译时不存在的主要内容,如果未能解决你的问题,请参考以下文章

类型错误时不存在 Angular 属性

运行编译型语言是相对于解释型语言存在的

Visual Studio 2008 在编译模板时不关心基类的存在?

使用发布 CRT 在调试中构建应用程序,但在 boost 上存在依赖问题

ReactJS / TypeScript-属性'file'在类型'HTMLElement'错误时不存在

检查 JSP 中是不是存在属性