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

仅重写属性Setter的C#子类在PowerShell中无法读取属性问题咨询

问题解答:PowerShell无法读取仅重写Setter的继承属性

这确实是PowerShell处理.NET属性时的一个已知行为,严格来说不算bug,而是它对属性可访问性的判断逻辑导致的——PowerShell会把仅显式重写了setter的属性判定为只写属性,忽略基类中已存在的getter。

原因分析

.NET本身允许子类仅重写属性的setter(保留基类的getter实现),但PowerShell在解析类型成员时,只会检查当前类型(这里是B)是否显式定义了getter。因为B只重写了setter,没有显式声明getter,PowerShell就会认为这个属性没有读取权限,从而无法直接访问。

简便解决方法

方法1:强制转换为基类实例(最直接)

把B的实例强制转换为基类A的类型,PowerShell就会使用基类的属性定义,自然就能访问到getter:

# 假设$b是B类的实例
([A]$b).p2

方法2:使用反射读取属性

如果需要更灵活的处理(比如不知道基类类型),可以用.NET反射直接获取属性并读取值:

$prop = $b.GetType().BaseType.GetProperty('p2')
$prop.GetValue($b)

方法3:修改C#类定义(如果有权限)

如果可以修改B类的代码,显式重写getter并调用基类实现,PowerShell就能正常识别并读取属性:

public class B : A {
    public override string p2 {
        get => base.p2; // 显式调用基类getter
        set => base.p2 = value; // 你的setter逻辑
    }
}

内容的提问来源于stack exchange,提问作者hectorct

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:31:31