可以将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; }
}
答案 0 :(得分:5)
不,不可能像这样投射。您需要编写自己的转换方法或运算符。对象base1
仅指 isn' Class2。 Field6
和Field7
的价值是什么?
答案 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,我们可以说Color
或Owner
或其他什么,但这并不意味着我可以把我的车当作航天飞机。