将一个类转换为另一个继承自相同基类的类

时间:2011-03-07 09:58:23

标签: c# inheritance

可以将class1转换为class2吗? 结果变量始终检索空值。

class Program
{
    static void Main(string[] args)
    {
        Class1 class1 = new Class1();
        class1.Field1 = "1";
        class1.Field2 = "2";
        class1.Field3 = "3";
        class1.Field4 = "4";
        class1.Field5 = "5";
        BaseClass base1 =  (BaseClass)class1;

        Class2 class2 = base1 as Class2;

        string result = class2.Field1;
    }
}

public class BaseClass
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

public class Class1 : BaseClass
{
    public string Field4 { get; set; }
    public string Field5 { get; set; }
}

public class Class2 : BaseClass
{
    public string Field6 { get; set; }
    public string Field7 { get; set; }
}

6 个答案:

答案 0 :(得分:5)

不,不可能像这样投射。您需要编写自己的转换方法或运算符。对象base1仅指 isn' Class2。 Field6Field7的价值是什么?

答案 1 :(得分:0)

无法将Class1强制转换为Class2。但是,对BaseClass来说当然是可能的。

答案 2 :(得分:0)

“能做到吗?”

不,它们都是BaseClass,并且都可以转换为BaseClass,但您无法将Class1转换为Class2,反之亦然。也不能BaseClass投放到Class1。您只能在继承链中向上投射。

如果您正在尝试克服繁琐的映射或其他问题,请考虑使用AutoMapper作为映射,这在这些情况下非常有用。

答案 3 :(得分:0)

此处的问题是您的Class1无法投放为Class2

当你这样做时

BaseClass base1 =  (BaseClass)class1;

您只是更改引用而不是对象本身。对象知道它是Class1。因此,当您尝试强制转换为Class2时,它会失败,因为一个不会从另一个继承。

答案 4 :(得分:0)

问题在于:

Class2 class2 = base1 as Class2;

问题是,这不知道如何处理Field6或Field7。您必须编写自己的转换,以便整理这些字段。

答案 5 :(得分:0)

假设问题是“为什么string result = class2.Field1;死于NullReferenceException”我将尝试解释。

让我们重新命名一下这些类。假设BaseClass是Vehicle,Class1是Car,Class2是SpaceShuttle。

所以,

BaseClass base1 =  (BaseClass)class1; 
//becomes
Vehicle myVehicle =  (Vehicle) myCar; 

没问题,演员甚至不是必要的。汽车永远是一辆汽车。但

Class2 class2 = base1 as Class2;
//becomes
SpaceShuttle shuttle = myVehicle as SpaceShuttle.

这里我说的是我的车辆是太空车,实际上是一辆旧的本田思域。编译器注意到这一点,并将shuttle变量设置为null,因为这就是as operator does。如果您问myVehicle是否为SpaceShuttle,它会以 NO 回复,如下所示:

bool isShuttle = (myVehicle is SpaceShuttle); //false

所以即使SpaceShuttle和Car都拥有相同的属性,继承自Vehicles,我们可以说ColorOwner或其他什么,但这并不意味着我可以把我的车当作航天飞机。