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

为何将子类实例强制转换为父类后,对象仍为子类类型?

问题原因解析
  • 强制转换只是编译时的类型标记,不改变对象本质:((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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:43:33