访问子类属性

时间:2017-02-09 05:51:09

标签: c# linq class inheritance

我有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;
}

4 个答案:

答案 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
}