调试中对象出现多个VgnItm属性的原因排查
为什么对象会出现多个同名VgnItm属性?
这是C#的**成员隐藏(Member Hiding)**机制,加上调试器的显示逻辑共同导致的:
- 基类
VgnItmEstDto定义了类型为VgnItmDto的VgnItm属性。 - 泛型子类
VgnItmEstDto<TVgnItmDto>用new关键字声明了同名的VgnItm属性——这个操作是隐藏基类的同名成员,而非覆盖,基类的VgnItm属性依然存在于子类实例中,只是通过子类实例直接访问时会优先调用new声明的版本。 - 调试器为了展示完整的对象结构,会分别显示:
- 子类自身的
VgnItm属性(new声明的,类型为TVgnItmDto) - 从基类继承的
VgnItm属性(基类定义的,类型为VgnItmDto) - 若项目中使用了序列化框架(比如代码里引用的Newtonsoft.Json或Nest),调试器可能还会显示序列化过程中生成的关联成员,最终出现三个同名条目。
- 子类自身的
如果要避免这种情况,建议用**虚属性+重写(virtual/override)**替代成员隐藏,这样基类和子类的属性是同一个成员的不同实现,不会出现多个同名条目:
// 基类修改为虚属性 public class VgnItmEstDto : CreatedBySomeoneDto { // ...其他属性 public virtual VgnItmDto VgnItm { get; set; } } // 子类重写属性 public class VgnItmEstDto<TVgnItmDto> : VgnItmEstDto where TVgnItmDto : VgnItmDto { public override TVgnItmDto VgnItm { get; set; } }
内容的提问来源于stack exchange,提问作者BeniaminoBaggins
相关产品推荐
相关产品推荐

