【发布时间】:2018-10-09 09:47:11
【问题描述】:
我有以下两种扩展方法
namespace Services.Resources.Extensions
{
public static class DataMapExtensions
{
public static T ToDTO<T>(this BaseModel model)
{
return Mapper.Map<T>(model);
}
public static List<T> ToDTO<T>(this List<BaseModel> models)
{
return Mapper.Map<List<T>>(models);
}
}
}
第一种方法效果很好。
//Note: FlightRoute inherits BaseModel
FlightRouteDTO foo = new FlightRoute().ToDTO<FlightRouteDTO>(); //This works!
但是,第二种方法似乎不起作用。
List<FlightRouteDTO> bar = new List<FlightRoute>().ToDTO<FlightRouteDTO>(); //This doesn't work!
编译器在说
错误 CS1929“List
”不包含“ToDTO”的定义,并且最佳扩展方法重载“DataMapExtensions.ToDTO (List )”需要“List 类型的接收器” '
但是FlightRoute 的类型是BaseModel。如果我将bar 的类型明确更改为List<BaseModel> ...,那么问题就消失了。
List<FlightRouteDTO> bar = new List<BaseModel>().ToDTO<FlightRouteDTO>(); //Why does it only work this way?
我是否遗漏了一些明显的东西?
【问题讨论】:
-
即使 FlightRoute 继承自 BaseModel,也不能直接调用带有 List
实例的 List 的扩展方法。 -
我想我不明白为什么不这样做。如果我将参数更改为泛型 List
并说类型 V 继承自 BaseModel,那么就可以了。但我认为 List 也应该工作,因为继承仍然存在 -
你应该阅读协方差 - 它会解释为什么你不能将
List<TDerived>分配给List<TBase>。
标签: c# generics inheritance type-conversion extension-methods