C# 强制转换为列表中的特定类型

C# 强制转换为列表中的特定类型,c#,.net,list,types,foreach,C#,.net,List,Types,Foreach,假设我们有一个名为Car的类和另外三个类(欧宝、大众和标致),它们继承了Car的信息,但是每个类都有一个特定的变量 所以我创建了一个新的汽车列表,在其中我添加了这三种类型的CarOpel…等等 Opel CarOpel = new Opel(parameters); 等等 List<Car> Cars = new List<Car>(); Car.Add(CarOpel); ? 如果你需要降低你的车来做一些事情,这可能表明你的继承层次结构是错误的,或者你的方法不在正确

假设我们有一个名为Car的类和另外三个类(欧宝、大众和标致),它们继承了Car的信息,但是每个类都有一个特定的变量

所以我创建了一个新的汽车列表,在其中我添加了这三种类型的CarOpel…等等

Opel CarOpel = new Opel(parameters);
等等

List<Car> Cars = new List<Car>();
Car.Add(CarOpel);
?


如果你需要降低你的车来做一些事情,这可能表明你的继承层次结构是错误的,或者你的方法不在正确的位置。它可能应该是
Car
类中的虚拟方法,该方法在派生类中被重写。还考虑阅读访问者模式。

你必须把它降到特定的类型。

foreach(Car car in Cars) 
{ 
    CarOpel opel = car as CarOpel;

    if (opel != null)
    {
        //do something with Opel
    }
}
使用或运算符

foreach ( Car car in Cars )
{

  if (car is Opel)
  {
   // do opel operation
    var op = (Opel)car;
  }

  if (car is Volkswagen)
  {
   // do VW operation
    var vw = (Volkswagen)car;
  }
}

您可以使用。您应该使用
is
as
,而不是
is
as
。如果你使用
is
你应该直接强制转换,如果你使用
as
你会想要空检查结果。我只想强调最后一段,而不是上半段。可能需要的方法应该在
Car
中,或者该列表实际上应该是一个比
Car
更具体的列表。
foreach ( Car car in cars)
{
    if(car is Opel) 
    {
        var opel = (Opel)car;
    }
}
foreach(Car car in Cars) 
{ 
    CarOpel opel = car as CarOpel;

    if (opel != null)
    {
        //do something with Opel
    }
}
foreach ( Car car in Cars )
{

  if (car is Opel)
  {
   // do opel operation
    var op = (Opel)car;
  }

  if (car is Volkswagen)
  {
   // do VW operation
    var vw = (Volkswagen)car;
  }
}