C# 包含多个派生对象的列表。如何访问派生字段中的字段
目前我正在使用一个名为的基类“JourneyLeg”。该基类有5个派生类,所有派生类都从基类继承。其中两类被称为“步行腿”和“车辆腿”。这两个派生类都包含“from”和“to”字段。其他三个没有C# 包含多个派生对象的列表。如何访问派生字段中的字段,c#,derived-class,base-class,C#,Derived Class,Base Class,目前我正在使用一个名为的基类“JourneyLeg”。该基类有5个派生类,所有派生类都从基类继承。其中两类被称为“步行腿”和“车辆腿”。这两个派生类都包含“from”和“to”字段。其他三个没有 列出腿 我现在有一个列表,里面有各种派生对象。其中一些是Walkingleg,一些是vehicleleg,其余的是其他3个派生类之一。该列表的定义如上所述 我想循环浏览完整的列表,只对步行和车辆对象执行操作。这些操作包括访问“发件人”和“收件人”。这两个字段仅在这两个派生类中可用,在基类中不可用 我能
列出腿
我现在有一个列表,里面有各种派生对象。其中一些是Walkingleg,一些是vehicleleg,其余的是其他3个派生类之一。该列表的定义如上所述
我想循环浏览完整的列表,只对步行和车辆对象执行操作。这些操作包括访问“发件人”和“收件人”。这两个字段仅在这两个派生类中可用,在基类中不可用
我能想到的唯一方法是检查它是否是两个派生类之一,然后执行操作(见下文)。但这样我就有了太多重复的代码。我想我不能在一个方法中提取重复的代码,因为我们给这个方法的参数对象是VehicleLeg或WalkingLeg,不能两者都是
案例车辆LEG车辆LEG:
{
var legTo=新方向RequestJourneyLegsLocation(vehicleLeg.To.LatLong,vehicleLeg.To.IsVisible);
var legFrom=新方向RequestJourneyLegsLocation(vehicleLeg.From.LatLong,vehicleLeg.From.IsVisible);
DirectionRequestJourneyLeg.id=车辆Leg.id;
DirectionRequestJourneyLeg.From=legFrom;
DirectionRequestJourneyLeg.To=legTo;
Directions RequestJourneyLeg.LegArrival=车辆Leg.From.Time.Planning;
Directions RequestJourneyLeg.LegDeviation=车辆Leg.To.Time.Planning;
DirectionRequestJourneyLeg.Type=DirectionRequestJourneyLegType.Vehicle;
DirectionRequestJourneyLeg.Modality=车辆Leg.Modality;
打破
}
案例步行腿步行腿:
{
var legTo=新方向RequestJourneyLegsLocation(walkingLeg.To.LatLong,walkingLeg.To.IsVisible);
var legFrom=新方向RequestJourneyLegsLocation(walkingLeg.From.LatLong,walkingLeg.From.IsVisible);
DirectionRequestJourneyLeg.id=walkingLeg.id;
DirectionRequestJourneyLeg.From=legFrom;
DirectionRequestJourneyLeg.To=legTo;
DirectionRequestJourneyLeg.LegArrival=walkingLeg.From.Time.Planning;
DirectionRequestJourneyLeg.LegDeviation=walkingLeg.To.Time.Planned;
DirectionRequestJourneyLeg.Type=DirectionRequestJourneyLegType.Walking;
打破
}
我可能错过了一些简单的东西。但我不能把我的头绕在它周围。我希望有人能让我重回正轨
以下是课程:
//
///JourneyLeg是用于定义以下各项之间共性的基类:
///
///*车辆标志、步行标志、过渡标志、广告标志*
///
公务舱游船
{
[必需]
公共字符串Id{get;set;}
[必需]
公共LegType类型{get;set;}
}
//
///车腿模型
///
公共级车辆如:长途跋涉
{
[必需]
公共模态类型模态{get;set;}
[必需]
来自{get;set;}的公共LegStop
[必需]
公共LegStop{get;set;}
}
//
///步行腿模型
///
公共类步行腿:JourneyLeg
{
[必需]
来自{get;set;}的公共LegStop
[必需]
公共LegStop{get;set;}
///
///以分钟为单位显示总步行时间,并在括号中以米为单位显示距离
///
[必需]
公共字符串说明{get;set;}
}
创建一个新类JourneyLegFromTo
或继承JourneyLeg
的类似类,然后创建VehicleLeg
和WalkingLeg
从新类继承
然后,您可以将代码简化为检查它是否是一个journeylegfromto
,而不是两个案例,并且您可以访问from和两个字段
public class JourneyLegFromTo : JourneyLeg
{
[Required]
public LegStop From { get; set; }
[Required]
public LegStop To { get; set; }
}
public class WalkingLeg : JourneyLegFromTo
{
...
}
public class VehicleLeg : JourneyLegFromTo
{
...
}
稍后:
case JourneyLegFromTo journeyLegFromTo:
{
var legTo = new DirectionsRequestJourneyLegsLocation(journeyLegFromTo.To.LatLong, journeyLegFromTo.To.IsVisible);
var legFrom = new DirectionsRequestJourneyLegsLocation(journeyLegFromTo.From.LatLong, journeyLegFromTo.From.IsVisible);
...
我只想添加一个中间类,将
从
和添加到
属性:
public class JourneyLeg
{
[Required]
public string Id { get; set; }
[Required]
public LegType Type { get; set; }
}
// You may want another name...
public class JourneyFromToLeg : JourneyLeg
{
[Required]
public LegStop From { get; set; }
[Required]
public LegStop To { get; set; }
}
public class VehicleLeg : JourneyFromToLeg
{
[Required]
public ModalityType Modality { get; set; }
}
public class WalkingLeg : JourneyFromToLeg
{
[Required]
public string Description { get; set; }
}
因此,您可以使用:
case JourneyFromToLeg fromToLeg:
{
var legTo = new DirectionsRequestJourneyLegsLocation(fromToLeg.To.LatLong, fromToLeg.To.IsVisible);
var legFrom = new DirectionsRequestJourneyLegsLocation(fromToLeg.From.LatLong, fromToLeg.From.IsVisible);
directionsRequestJourneyleg.id = fromToLeg.Id;
directionsRequestJourneyleg.From = legFrom;
directionsRequestJourneyleg.To = legTo;
directionsRequestJourneyleg.LegArrival = fromToLeg.From.Time.Planned;
directionsRequestJourneyleg.LegDeparture = fromToLeg.To.Time.Planned;
// you may want to think a little more of this too
if (fromToLeg is WalkingLeg)
{
directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Walking;
}
else
{
directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Vehicle;
directionsRequestJourneyleg.Modality = ((VehicleLeg)fromToLeg).Modality;
}
break;
}
如果您更喜欢使用接口继承,则可以使用
IFromLeg
/IToLeg
/IFromToLeg
接口,而不是类继承-类上可以有多个接口(例如腿部和手臂可以有IVehile接口,但它们有独立的ILeg和IArm接口)注意:我在我的答案上添加了完整的开关,因为案例
以步行腿
和车辆leg
结束。我正在实现这个答案,但仍然存在问题。查看了我的代码,得出结论,该列表只包含基本JourneyLeg类对象。它是在我的web控件中创建的从“posted”JSON中删除,当然它不知道派生类,只知道基类。我想我必须检查字段并创建一个新对象。仍然希望检查答案是否正确,这个答案肯定会帮助解决上述问题。
case JourneyFromToLeg fromToLeg:
{
var legTo = new DirectionsRequestJourneyLegsLocation(fromToLeg.To.LatLong, fromToLeg.To.IsVisible);
var legFrom = new DirectionsRequestJourneyLegsLocation(fromToLeg.From.LatLong, fromToLeg.From.IsVisible);
directionsRequestJourneyleg.id = fromToLeg.Id;
directionsRequestJourneyleg.From = legFrom;
directionsRequestJourneyleg.To = legTo;
directionsRequestJourneyleg.LegArrival = fromToLeg.From.Time.Planned;
directionsRequestJourneyleg.LegDeparture = fromToLeg.To.Time.Planned;
// you may want to think a little more of this too
if (fromToLeg is WalkingLeg)
{
directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Walking;
}
else
{
directionsRequestJourneyleg.Type = DirectionsRequestJourneyLegType.Vehicle;
directionsRequestJourneyleg.Modality = ((VehicleLeg)fromToLeg).Modality;
}
break;
}