我有2个以这种方式继承的课程
public class PartsParent
{
}
public class PartsCar : PartsParent
{
public int WheelRadius { get; set; }
public int Price { get; set; }
}
public class PartsBike : PartsParent
{
public int Length { get; set; }
public int Weight { get; set; }
public int Price { get; set; }
}
我有一个接受类PartsParent作为参数的函数,如何将它作为partsCar /作为PartsBike转换为函数和访问属性,如Price WheelRadius等?
private int PriceCollection(PartsParent mainObject)
{
int _price=0;
mainObject.OfType(PartsCar).Price;// something similar??
return _price;
}
答案 0 :(得分:2)
嗯,你正在尝试将父类型转换为子类型,这实际上是不可能的,为什么?
答案是你试图转换为子C1的父P实际上可能是C2的类型,所以演员阵容无效。
解释这个的最好方法是我在stackoverflow
上读到的一个短语你不能将哺乳动物变成狗 - 它可能是一只猫。
你不能把食物撒成三明治 - 它可能是芝士汉堡。
你可以做些什么来改变这种情况是这样的:
(mainObject is PartsCar) ? (PartsCar)mainObject : mainObject
相当于:
mainObject as PartsCar
然后使用null coalescing operator访问mainObject的强制转换结果(因为如果失败,则转换结果将为null而不是抛出异常)。
您尝试使用的通用方法OfType<T>
是一种可以与IEnumerable<T'>
类型的对象一起使用的扩展方法,我想这不是您的情况。
答案 1 :(得分:1)
继承的想法是将超类中常见的内容组合在一起,并将其他特定细节留给子类。因此,如果一个属性(比如Price
)被排除在所有子类之外,那么它应该在超类中声明。
但是,如果您仍然希望以这种方式使用它,那么您在寻找的是:
int _price = ((PartsCar)mainObject).Price;
但是,如果该对象属于其他类,请说PartsGift
继承自PartsParent
,但没有价格怎么办?然后就会崩溃。
你几乎真的需要检查你的设计。
顺便说一句,如果你想检查一个对象是否真的是一个特定的类,那么你可以使用is。
int number = 1;
object numberObject = number;
bool isValid = numberObject is int; // true
isValid = numberObject is string; // false
答案 2 :(得分:0)
您可以使用is
关键字检查类型,并使用as
关键字转换为目标子类型,如下所示。
if (mainObject is PartsCar)
{
var partscar = mainObject as PartsCar;
// Do logic related to car parts
}
else if (mainObject is PartsBike)
{
var partsbike = mainObject as PartsBike;
// Do logic related to bike parts.
}
答案 3 :(得分:0)
如果您将代码的非常见属性分成块,则可以使用
if (mainObject is PartsCar)
{
//Seprated code for PartsCar
// WheelRadius...
//Price...
}
else if (mainObject.GetType() == typeof(PartsBike))
{
//Seprated code for PartsBike
//Length
//Weight
//Price
}