c# - 具有相同基类的泛型列表
问题描述
我正在尝试实现一个泛型对象的通用列表,其中列表中的泛型对象的类型具有相同的基类。
一个简化的场景是:我想要一个带有车辆区域的车库。一个区域有汽车,另一个区域有自行车。
这是一个小例子:
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; }
}
知道为什么这是不可能的或我错过了什么吗?
解决方案
改变
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>() };
现在你的carArea
andbikeArea
是一个Area<Vehicle>
(你的车库期望的)并且每个都有自己的相关车辆,这将在你的方法中工作。
并获取列表中的车辆类型:
if(area.GetType() == typeof(List<Car>))
{
}
推荐阅读
- python - 如何告诉 Python 脚本持续运行,让 Excel 文件保持打开状态并更新其中的输出
- flutter - 当我使用共享首选项时缺少插件
- javascript - 不断等待点击(不管 DOM 的变化或其他点击)
- python - 如何编写代码将日志记录为 argv?
- angular - 如何使用 NX/Nrwl 为 Angular 创建应用程序特定配置?
- ansible - 一个悖论 - 将我的 Ansible 服务器置于 CM 控制之下?
- docker - 项目(https://github.com/TencentCloud/O266player.git)构建失败Windows错误(docker)
- c# - C# Xamarin Forms - 调用事件总是返回 null
- autodesk-forge - 如何在伪造查看器中移动到任何给定坐标
- r - 有没有办法用代表 R 中数字的命名元素对列表进行排序,以便它返回元素的名称 ratehr 而不是它们的值?