为泛型扩展方法创建重载
本文关键字:创建 重载 方法 扩展 泛型 | 更新日期: 2023-09-27 17:49:43
我已经创建了以下扩展。
public static class QueryableExtensions
{
public static QueryMapper<TSource> Map<TSource>(this IQueryable<TSource> source)
{
return new QueryMapper<TSource>(source);
}
public static ObjectMapper<TSource> Map<TSource>(this TSource obj)
{
return new ObjectMapper<TSource>(obj);
}
}
如何调用上面的
return this.repository.FindAll()
.OrderBy(o => o.Name)
.Map().To<TEntityDto>();
误差不能隐式地将类型"TEntityDto"转换为"System.Collections.Generic.IEnumerable"。一个显式的存在转换(您是否缺少强制类型转换?)
我最初的解决方案是将IQueryable作为输入的方法重命名为"MapQuery"…
但是我希望在对象或集合上调用它时具有相同的命名约定。我不确定如何添加约束(或其他东西)来限制调用/源对象应该是什么样子。(如。单个类/类集合)
添加这个解决了我的问题,因为我使用它的查询链有一个order by,结果对象是IOrderedQueryable,而不是IQueryable。
public static QueryMapper<TSource> Map<TSource>(this IOrderedQueryable<TSource> source)
{
return new QueryMapper<TSource>(source);
}
作为最后的想法…
我只是想知道为什么"Map(this TSource obj)",有偏好"Map(this IQueryable source)",因为IOrderedQueryable有一个基本类型的IQueryable?
关于主题的更多信息
泛型和调用来自不同类的重载方法-优先级问题