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
相关产品推荐
相关产品推荐

