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的回答一样,将对象强制转换为子类型没有意义。