将子类转换为父类

MOD*_*MOD 1 .net c# asp.net asp.net-mvc

我有两个班级ProductExtendedProduct. ExtendedProduct派生自Product类。ExtendedProduct课堂上还有一些字段。

问题是,当我投射ExtendedProductProduct我的Product对象中有字段时ExtendedProduct

我只想转换ExtendedProductProduct班级,而班级中不ExtendedProduct出现任何班级字段Product

Him*_*ere 6

只要您ExtendedProduct是将Product其转换为后者就不会对转换实例进行任何更改,因为您引用了相同的对象。所以毕竟你只是从另一个角度看同一个对象。

为了将您的对象与其基本类型分离,您需要创建一个克隆,一个全新的 实例Product,例如通过使用复制构造函数:

class Product {
    public Product(Product p) {
        this.MyProp = p.MyProp;   
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以这样称呼它:

var product = new Product(myExtended);
Run Code Online (Sandbox Code Playgroud)

现在两个对象完全不相关,改变MyProp一个不会影响另一个(实际上它会影响,如果MyProp是引用类型,所以你需要一个深度克隆)。

然而,这对我来说听起来很奇怪。为什么要“删除”扩展属性呢?您将需要之前提供的所有额外信息。您可以简单地转换为根本不提供这些属性的父类:

var p = (Product) myExtendedProduct;
Run Code Online (Sandbox Code Playgroud)

现在虽然p实际上是ExtendedProduct您的一个实例,但您只能从Product. 这是多态的基本原则。

  • 我猜 OP 将在下一步中序列化实例,这就是他不想要不必要的属性/字段的原因。 (5认同)