Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问子类属性_C#_Linq_Class_Inheritance - Fatal编程技术网

C# 访问子类属性

C# 访问子类属性,c#,linq,class,inheritance,C#,Linq,Class,Inheritance,我有两个类是以这种方式继承的 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 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/as PartsBike并访问Price WheelRadius等属性

private int PriceCollection(PartsParent mainObject)
{

  int _price=0;
  mainObject.OfType(PartsCar).Price;// something similar?? 
  return _price;
}

那么,您正试图将父类型强制转换为子类型,这实际上是不可能的,为什么

答案是,您试图强制转换到子C1的父p实际上可能是C2类型,因此强制转换无效

最好的解释方法是我在stackoverflow上读到的一个短语

你不能把哺乳动物扔给狗——它可能是猫

你不能把食物扔进三明治里——它可能是一个奶酪汉堡

不过,要扭转这种局面,您可以做以下几点:

(mainObject is PartsCar) ? (PartsCar)mainObject : mainObject 
这相当于:

mainObject as PartsCar
然后使用访问mainObject的强制转换结果(因为如果as失败,强制转换结果将为null,而不是引发异常)


您尝试使用的泛型方法是一种扩展方法,可用于类型为
IEnumerable的对象。好吧,您正在尝试将父类型强制转换为子类型,这实际上是不可能的,为什么

答案是,您试图强制转换到子C1的父p实际上可能是C2类型,因此强制转换无效

最好的解释方法是我在stackoverflow上读到的一个短语

你不能把哺乳动物扔给狗——它可能是猫

你不能把食物扔进三明治里——它可能是一个奶酪汉堡

不过,要扭转这种局面,您可以做以下几点:

(mainObject is PartsCar) ? (PartsCar)mainObject : mainObject 
这相当于:

mainObject as PartsCar
然后使用访问mainObject的强制转换结果(因为如果as失败,强制转换结果将为null,而不是引发异常)


您尝试使用的泛型方法是一种扩展方法,可用于
IEnumerable类型的对象继承的思想是将超类中常见的内容分组,并将其他特定细节留给子类。因此,如果一个属性,比如说
Price
,被排除在所有子类之外,那么它应该在超类中声明

但是,如果您仍然希望以这种方式使用它,那么您需要的是:

int _price = ((PartsCar)mainObject).Price;
但是,如果对象属于其他类,例如继承自
PartsParent
但没有价格的
PartsGift
,该怎么办?然后它就会崩溃

你几乎真的需要检查你的设计

顺便说一句,如果你想检查一个对象是否真的属于某个特定的类,那么你可以使用is

int number = 1;
object numberObject = number;
bool isValid = numberObject is int; // true
isValid = numberObject is string; // false

继承的思想是将超类中常见的内容分组,并将其他特定细节留给子类。因此,如果一个属性,比如说
Price
,被排除在所有子类之外,那么它应该在超类中声明

但是,如果您仍然希望以这种方式使用它,那么您需要的是:

int _price = ((PartsCar)mainObject).Price;
但是,如果对象属于其他类,例如继承自
PartsParent
但没有价格的
PartsGift
,该怎么办?然后它就会崩溃

你几乎真的需要检查你的设计

顺便说一句,如果你想检查一个对象是否真的属于某个特定的类,那么你可以使用is

int number = 1;
object numberObject = number;
bool isValid = numberObject is int; // true
isValid = numberObject is string; // false

您可以使用
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.
 }

您可以使用
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.
 }

如果将代码中的不常见属性分隔为块,则有可能:

if (mainObject is PartsCar)
{
    //Seprated code for PartsCar
    // WheelRadius...
    //Price...
}
else if (mainObject.GetType() == typeof(PartsBike))
{
    //Seprated code for PartsBike 
    //Length
    //Weight
    //Price
}

如果将代码中的不常见属性分隔为块,则有可能:

if (mainObject is PartsCar)
{
    //Seprated code for PartsCar
    // WheelRadius...
    //Price...
}
else if (mainObject.GetType() == typeof(PartsBike))
{
    //Seprated code for PartsBike 
    //Length
    //Weight
    //Price
}

((PartsCar)主对象)。应计算车轮半径。但是,如果必须将对象强制转换为子类型,则应该尝试重新设计它。顺便说一句,您应该在
PartsParent
中定义
Price
,因为所有子类型都需要Price。如果是这样,您可以访问
main object.Price
,而无需对其进行转换。@J.C是的,您是对的,公共属性应该仅是父类的一部分,并且所讨论的对象属性只是一个示例。你的建议解决了我的问题。当然,这个代码应该有效。不过,我建议你考虑重新设计你的程序。就像@AymenDaoudi的回答一样,将对象强制转换为子类型没有意义。
((PartsCar)main object)。WheelRadius
应该工作。但是,如果必须将对象强制转换为子类型,则应该尝试重新设计它。顺便说一句,您应该在
PartsParent
中定义
Price
,因为所有子类型都需要Price。如果是这样,您可以访问
main object.Price
,而无需对其进行转换。@J.C是的,您是对的,公共属性应该仅是父类的一部分,并且所讨论的对象属性只是一个示例。你的建议解决了我的问题。当然,这个代码应该有效。不过,我建议你考虑重新设计你的程序。就像@AymenDaoudi的回答一样,将对象强制转换为子类型没有意义。