将子类转换为父类

时间:2016-01-29 08:05:44

标签: c# asp.net .net asp.net-mvc

我有两个班级ProductExtendedProductExtendedProduct派生自Product类。 ExtendedProduct类中还有一些字段。

问题在于,当我将ExtendedProduct投射到Product时,我的Product对象具有ExtendedProduct所拥有的字段。

我只想将ExtendedProduct转换为Product类,ExtendedProduct类中没有任何Product类'字段。

5 个答案:

答案 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方法。您将获得所需的输出。