You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SaveFileDialog.ShowPinnedPlaces无法访问?及版本兼容编译指令咨询

问题解答

一、无法访问ShowPinnedPlaces的原因

ShowPinnedPlaces是FileDialog类中的受保护(protected)成员,而非公共(public)成员。虽然SaveFileDialog继承自FileDialog,但受保护成员的访问范围仅限于派生类内部,外部代码(比如你在using块中直接实例化SaveFileDialog后调用)没有权限访问该成员。

二、通过编译指令实现版本兼容的方案

要实现版本兼容,需要先派生自定义类暴露该属性,再结合条件编译指令区分不同.NET版本的代码逻辑:

1. 派生自定义对话框类

先创建一个继承自SaveFileDialog的子类,将受保护的ShowPinnedPlaces包装为公共属性:

public class CustomSaveFileDialog : SaveFileDialog
{
    // 重写并暴露ShowPinnedPlaces属性
    public new bool ShowPinnedPlaces
    {
        get => base.ShowPinnedPlaces;
        set => base.ShowPinnedPlaces = value;
    }
}

2. 使用条件编译指令

根据目标.NET版本的预定义编译符号,编写分支代码:

#if NETFRAMEWORK && (NET20 || NET35 || NET40 || NET45 || NET46 || NET47 || NET48)
// .NET Framework 2.0及以上版本,可使用自定义类访问ShowPinnedPlaces
using (var fHandle = new CustomSaveFileDialog())
{
    fHandle.ShowPinnedPlaces = false; // 根据需求设置值
    if (fHandle.ShowDialog() == DialogResult.OK)
    {
        // 保存文件逻辑
    }
}
#else
// .NET Core 3.0以下(不支持WinForms)或其他不兼容版本,使用原生SaveFileDialog
using (var fHandle = new SaveFileDialog())
{
    if (fHandle.ShowDialog() == DialogResult.OK)
    {
        // 保存文件逻辑
    }
}
#endif

说明

  • 预定义编译符号:.NET Framework对应NET20、NET35等版本符号;.NET Core/.NET 5+对应NETCOREAPP3_0、NET5_0等(WinForms从.NET Core 3.0开始支持)。
  • 若目标框架包含.NET Core/.NET 5+,需确认ShowPinnedPlaces在对应版本的WinForms中是否存在(该属性在.NET Core 3.0+的WinForms中仍为受保护成员,同样需要派生类暴露)。

内容的提问来源于stack exchange,提问作者beg-inner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:32:41