C# 包含多个派生对象的列表。如何访问派生字段中的字段

C# 包含多个派生对象的列表。如何访问派生字段中的字段,c#,derived-class,base-class,C#,Derived Class,Base Class,目前我正在使用一个名为的基类“JourneyLeg”。该基类有5个派生类,所有派生类都从基类继承。其中两类被称为“步行腿”和“车辆腿”。这两个派生类都包含“from”和“to”字段。其他三个没有 列出腿 我现在有一个列表,里面有各种派生对象。其中一些是Walkingleg,一些是vehicleleg,其余的是其他3个派生类之一。该列表的定义如上所述 我想循环浏览完整的列表,只对步行和车辆对象执行操作。这些操作包括访问“发件人”和“收件人”。这两个字段仅在这两个派生类中可用,在基类中不可用 我能

目前我正在使用一个名为的基类“JourneyLeg”。该基类有5个派生类,所有派生类都从基类继承。其中两类被称为“步行腿”“车辆腿”。这两个派生类都包含“from”和“to”字段。其他三个没有

列出腿
我现在有一个列表,里面有各种派生对象。其中一些是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;
}