只要您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. 这是多态的基本原则。