如何在基类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
相关产品推荐
相关产品推荐

