为何将子类实例强制转换为父类后,对象仍为子类类型?
问题原因解析
- 强制转换只是编译时的类型标记,不改变对象本质:
((Parent)myChild)只是让编译器把myChild当作Parent类型做编译检查,但内存里的对象还是Child实例,实际类型根本没变。 - ShallowCopy的实现决定了返回实例的类型:如果你的
ShallowCopy是Child类里的实现(哪怕是重写父类的方法),那它返回的必然是Child实例。比如MemberwiseClone()会创建和当前对象同类型的实例,哪怕你把返回值转成Parent,实际类型还是Child。
举个直观的代码例子,假设你的类是这么写的:
public class Parent { public int ParentField { get; set; } public virtual Parent ShallowCopy() { return (Parent)this.MemberwiseClone(); } } public class Child : Parent { public int ChildField { get; set; } public override Parent ShallowCopy() { // 这里返回的是Child类型,转成Parent只是编译层面的转换 return (Child)this.MemberwiseClone(); } }
调用((Parent)myChild).ShallowCopy()时,实际执行的是Child类的ShallowCopy方法,返回的自然是Child实例。
正确实现方式
要得到真正的Parent实例并移除子类的额外属性,得手动创建Parent对象,把Child中属于父类的属性复制过去:
方法1:手动复制属性(简单直接)
myParent = new Parent(); myParent.ParentField = myChild.ParentField; // 其他父类属性依次复制
方法2:反射批量复制(适合属性多的情况)
myParent = new Parent(); // 获取父类的所有实例属性 var parentProps = typeof(Parent).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); foreach (var prop in parentProps) { // 从子类实例中取属性值,赋值给父类实例 var value = prop.GetValue(myChild); prop.SetValue(myParent, value); }
方法3:给父类加专属复制方法
在Parent类里写一个方法,专门创建Parent实例并复制自身属性,子类调用这个方法就能得到纯父类实例:
public class Parent { public int ParentField { get; set; } public Parent CreateParentCopy() { return new Parent { ParentField = this.ParentField }; } } // 调用方式 myParent = myChild.CreateParentCopy();
内容的提问来源于stack exchange,提问作者user3844416
相关产品推荐
相关产品推荐

