仅重写属性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
相关产品推荐
相关产品推荐

