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

如何在基类classA中获取派生类classB隐藏的pA属性值

基类引用派生类用new隐藏的属性值解决方案

背景

基类classA包含类型为baseType的属性pA。派生类classB继承自classA,并使用*new*修饰符隐藏了pA属性:

public new newType pA;

其中newType是baseType的子类。

核心需求

在classA的方法中,需要获取classB实例中pA的有效值——当前classA中访问classB实例的pA返回null,但classB自身的pA已完成初始化。

可行方案对比

  • 使用override:能实现基类获取派生类属性值,但属性类型必须保持为baseType,无法使用更具体的newType:
    public override baseType pA;
    
  • 使用new修饰符:支持使用newType类型,但默认情况下基类无法获取派生类的pA值。
  • 声明+重写组合:可行但不够简洁,需要额外声明一个属性:
    public newType pB { get; set; }
    public override baseType pA { get => pB; }
    

反射方案的问题与修正

最初尝试用反射让基类获取派生类的pA,但筛选逻辑存在问题:

public virtual baseType pA {
get { return GetType().GetProperties().Where(t => t.Name == "pA" && !(t.DeclaringType is classA)).First().GetValue(this) as baseType; }
set {...} }

上述代码会同时返回classA和classB的pA属性,无法精准筛选出派生类的属性。

注意:不能在classA中直接写((classB)this).pA,这会导致classA依赖classB,后续新增继承自classA的classC时该代码会失效。

最终修正后的实现

基类classA的pA定义

修改反射筛选逻辑,精准排除classA自身声明的pA:

public virtual baseType pA {
    get {
        var derivedProperty = GetType().GetProperties()
            .Where(t => t.Name == "pA" && !t.DeclaringType.Equals(typeof(classA)))
            .FirstOrDefault();
        return derivedProperty != null ? derivedProperty.GetValue(this) as baseType : _pA;
    }
    set => _pA = value;
}

派生类classB的pA定义

保持使用new修饰符定义pA:

public new newType pA { get; set; }

此时在classA的方法中调用baseMethod(pA)时,pA会自动获取classB中初始化后的属性值,同时classA的pA保持baseType类型,classB的pA使用更具体的newType类型。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 18:19:58