为泛型扩展方法创建重载

本文关键字:创建 重载 方法 扩展 泛型 | 更新日期: 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?

关于主题的更多信息

泛型和调用来自不同类的重载方法-优先级问题