我有两个班级Product
和ExtendedProduct
。 ExtendedProduct
派生自Product
类。 ExtendedProduct
类中还有一些字段。
问题在于,当我将ExtendedProduct
投射到Product
时,我的Product
对象具有ExtendedProduct
所拥有的字段。
我只想将ExtendedProduct
转换为Product
类,ExtendedProduct
类中没有任何Product
类'字段。
答案 0 :(得分:4)
只要你的ExtendedProduct
是一个Product
将它转换为后者,就不会改变任何内容,因为你引用了同一个对象。因此,您需要一个全新的Product
实例,例如通过使用复制构造函数:
class Product {
public Product(Product p) {
this.MyProp = p.MyProp;
}
}
现在你可以这样称呼:
var product = new Product(myExtended);
然而,这对我来说听起来很奇怪。你为什么要“删除”扩展属性呢?您需要先前提供的所有额外信息。您可以简单地转换为完全不提供这些属性的父类:
var p = (Product) myExtendedProduct;
现在虽然p
实际上是ExtendedProduct
的实例,但您只能访问Product
中的属性。这是多态性的基本原理。
答案 1 :(得分:1)
您可以为ExtendedProduct
类编写扩展名并在那里处理您的映射:
public static Product ToProduct(this ExtendedProduct extProduct)
{
var product = new Product();
product.par1 = extProduct.Par1;
// ...
return product;
}
然后像这样调用它:
var myExtProduct = new ExtendedProduct();
var product = myExtProduct.toProduct();
答案 2 :(得分:0)
我想你想要:
ExtendedProduct product = new ExtendedProduct();
Product p = product;
如果您不确定转换,可以随时执行此操作:
ExtendedProduct product = new ExtendedProduct();
Product p = product as Product;
详细here
答案 3 :(得分:0)
您还可以向基类添加一个方法,该方法返回基类作为基类的类。
Public Class Base
{
Public Base GetBase()
{
return (Base)this;
}
}
现在是否继承了这个基类。您可以从中调用该方法并返回Base类。
答案 4 :(得分:0)
直接强制转换为父类将只更改其引用方式,而不更改其结构。以下代码段可能对您有所帮助。我正在使用JsonConvert使其简短。 如果您不使用Newtonsoft,则可以尝试复制单个字段并生成一个副本。
class ExtendedProduct : Product
{
object notrequired { get; set; }
static Product copy(ExtendedProduct extendedProduct)
{
var orig = JsonConvert.SerializeObject(extendedProduct);
Product copy = JsonConvert.DeserializeObject<Product>(orig);
return copy;
}
}
只需将ExtendedProduct对象传递给静态的copy方法。您将获得所需的输出。