首页 > 解决方案 > 具有相同基类的泛型列表

问题描述

我正在尝试实现一个泛型对象的通用列表,其中列表中的泛型对象的类型具有相同的基类。

一个简化的场景是:我想要一个带有车辆区域的车库。一个区域有汽车,另一个区域有自行车。

这是一个小例子:

    public class MyGarage
    {
        public List<Area<Vehicle>> Create()
        {
            var vehicles = new List<Vehicle> { new Car(), new Bike() };
            var carArea = new Area<Car> { Vehicles = new List<Car>() };
            var bikeArea = new Area<Bike> { Vehicles = new List<Bike>() };
            var garage = new List<Area<Vehicle>>();

            // Not working - can't convert from Area<Car> to Area<Vehicle>
            garage.Add(carArea);
            garage.Add(bikeArea);
            
            return garage;
        }

        public void DoSomething()
        {
            var garage = Create();

            var area = garage.FirstOrDefault();
            if (area is Area<Car>)
            {
                // do something car related
            }
            else if (area is Area<Bike>)
            {
                // do something bike related
            }
        }
    }

    public abstract class Vehicle { }
    public class Car : Vehicle { }
    public class Bike : Vehicle { }

    public class Area<T> where T : Vehicle
    {
        public IEnumerable<T> Vehicles { get; set; }
    }

知道为什么这是不可能的或我错过了什么吗?

标签: c#generics

解决方案


改变

var carArea = new Area<Car> { Vehicles = new List<Car>() };
var bikeArea = new Area<Bike> { Vehicles = new List<Bike>() };

var carArea = new Area<Vehicle> { Vehicles = new List<Car>() };
var bikeArea = new Area<Vehicle> { Vehicles = new List<Bike>() };

现在你的carAreaandbikeArea是一个Area<Vehicle>(你的车库期望的)并且每个都有自己的相关车辆,这将在你的方法中工作。

并获取列表中的车辆类型:

if(area.GetType() == typeof(List<Car>))
{

}

推荐阅读