C#继承DTO基类的子类如何修改对应继承属性的返回类型
实现方案
方案1:泛型基类实现(推荐)
这是最符合类型安全要求的实现方式,不需要重复定义属性,也不会有成员隐藏的坑:
// 改造为泛型基类,约束类型参数必须继承自BaseItem public class BaseOrder<TItem> where TItem : BaseItem { //Other common properties public List<TItem> Items { get; set; } } // 可选:保留非泛型版本给不需要扩展Item的普通场景使用 public class BaseOrder : BaseOrder<BaseItem> { } public class BaseItem { //Properties to do with an Item } // 继承时指定泛型参数为AdminItem,自动获得List<AdminItem>类型的Items属性 public class AdminOrder : BaseOrder<AdminItem> { // 直接扩展其他AdminOrder专属属性即可,不需要重复定义Items } public class AdminItem : BaseItem { //Properties to do with an Item AND Admin stuff too }
优势:
- 完全的类型安全,不需要手动做类型转换
- 没有成员隐藏问题,不管用基类还是子类引用访问属性,类型都是符合预期的
- 后续新增其他派生场景只需要指定对应泛型参数即可,比如新增
UserOrder : BaseOrder<UserItem>就可以快速实现
方案2:用new关键字隐藏基类成员(兼容现有非泛型基类场景)
如果你无法修改已有BaseOrder的结构,已经有大量业务依赖非泛型的BaseOrder,可以用new关键字显式隐藏基类的Items属性:
public class BaseOrder { //Other common properties public List<BaseItem> Items { get; set; } } public class BaseItem { //Properties to do with an Item } public class AdminOrder: BaseOrder { // 用new显式声明隐藏基类的同名属性 public new List<AdminItem> Items { get; set; } } public class AdminItem:BaseItem { //Properties to do with an Item AND Admin stuff too }
注意事项:
- 当你用
BaseOrder类型的引用指向AdminOrder实例时,访问到的Items还是List<BaseItem>类型,只有用AdminOrder类型的引用访问才会拿到List<AdminItem>类型 - 要自行保证两个属性的值同步,避免出现基类和子类属性指向不同集合的问题
内容的提问来源于stack exchange,提问作者raklos
相关产品推荐
相关产品推荐

