C# 迭代具有不同结构的类

C# 迭代具有不同结构的类,c#,C#,我需要在HTML表中显示上述类的实例。所有对象都应按速度属性排序 public class Bus { public float Speed {get; set;} public string Name {get; set;}} public class Tram { public float Speed {get; set;} public string Name {get; set;}} public class Car { public float Speed {get; set;} pu

我需要在HTML表中显示上述类的实例。所有对象都应按速度属性排序

public class Bus { public float Speed {get; set;} public string Name {get; set;}}
public class Tram { public float Speed {get; set;} public string Name {get; set;}}
public class Car { public float Speed {get; set;} public string Name {get; set;}}
public class Bike 
{ 
    public float Speed {get; set;}
    public string Name {get; set;}
    public double Height {get; set;}
    public double Width {get; set;}
}
表如下所示:

  Name | Speed | Height | Width

Bus    |   180   |            |
Bus    |   179   |            |
Bike   |   30    |    23      |  32
Tram   |   23    |            |
我如何迭代这些对象,然后显示它们?我应该实现一些接口吗?
如果所有类都有相同的字段,这将非常容易,但在本例中,Bike类有四个属性。

在创建模型时,首先确定概念的公共属性。您可以使用公共属性创建一个抽象基类(在我的示例中名为“Vehicle”),然后在子类中继承:

public abstract class Vehicle
{
    public string Name { get; set; }
    public float Speed { get; set; }
}

public class Bus : Vehicle { }
public class Tram : Vehicle { }
public class Car : Vehicle { }
public class Bike : Vehicle
{
    public double Width { get; set; }
    public double Height { get; set; }
}
然后可以迭代基类类型的集合,并在处理每个实例之前对其进行类型检查:

var vehicles = new List<Vehicle>
{
    new Bus { Name = "Bus", Speed = 180 },
    new Bus { Name = "Bus", Speed = 179 },
    new Bike { Name = "Bus", Speed = 180, Height = 23, Width = 32 },
    new Tram { Name = "Bus", Speed = 23 }
};

foreach (var vehicle in vehicles)
{
    // ..Output vehicle.Name & vehicle.Speed
    if (vehicle is Bike bike)
    {
        // Output bike.Height & bike.Width
    }
}
var车辆=新列表
{
新总线{Name=“Bus”,速度=180},
新总线{Name=“Bus”,速度=179},
新自行车{Name=“Bus”,速度=180,高度=23,宽度=32},
新电车{Name=“Bus”,速度=23}
};
foreach(车辆中的var车辆)
{
//..输出车辆.名称和车辆.速度
if(车辆为自行车)
{
//输出自行车。高度和自行车。宽度
}
}

在创建模型时,首先确定概念的公共属性。您可以使用公共属性创建一个抽象基类(在我的示例中名为“Vehicle”),然后在子类中继承:

public abstract class Vehicle
{
    public string Name { get; set; }
    public float Speed { get; set; }
}

public class Bus : Vehicle { }
public class Tram : Vehicle { }
public class Car : Vehicle { }
public class Bike : Vehicle
{
    public double Width { get; set; }
    public double Height { get; set; }
}
然后可以迭代基类类型的集合,并在处理每个实例之前对其进行类型检查:

var vehicles = new List<Vehicle>
{
    new Bus { Name = "Bus", Speed = 180 },
    new Bus { Name = "Bus", Speed = 179 },
    new Bike { Name = "Bus", Speed = 180, Height = 23, Width = 32 },
    new Tram { Name = "Bus", Speed = 23 }
};

foreach (var vehicle in vehicles)
{
    // ..Output vehicle.Name & vehicle.Speed
    if (vehicle is Bike bike)
    {
        // Output bike.Height & bike.Width
    }
}
var车辆=新列表
{
新总线{Name=“Bus”,速度=180},
新总线{Name=“Bus”,速度=179},
新自行车{Name=“Bus”,速度=180,高度=23,宽度=32},
新电车{Name=“Bus”,速度=23}
};
foreach(车辆中的var车辆)
{
//..输出车辆.名称和车辆.速度
if(车辆为自行车)
{
//输出自行车。高度和自行车。宽度
}
}

您需要使用Reflection是否可以在此处引入父类?这将帮助您利用LINQ并执行类似于,
.SortBy
的操作,按
Speed
属性对元素进行排序。@mjwills:和
Name
属性。您可以将这些属性移动到一个抽象基类并从此基类继承。创建一个基类,该基类具有属性名称、速度、高度和宽度,这将使其易于迭代。基类
Machine
,然后具有class
Tram:Machine
等等。您需要使用reflection在此处引入父类吗?这将帮助您利用LINQ并执行类似于,
.SortBy
的操作,按
Speed
属性对元素进行排序。@mjwills:和
Name
属性。您可以将这些属性移动到一个抽象基类并从此基类继承。创建一个基类,该基类具有属性名称、速度、高度和宽度,这将便于迭代。基类
Machine
,然后具有class
Tram:Machine
等等