【问题标题】:Create overload for generic extension method为泛型扩展方法创建重载
【发布时间】:2014-03-12 08:45:04
【问题描述】:

我创建了以下扩展。

代码

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”...

但我希望在对象或集合上调用它时使用相同的命名约定。我不确定如何添加约束(或其他东西)来限制调用/源对象的外观。 (EG.单个类/类的集合)

【问题讨论】:

    标签: c# generics extension-methods


    【解决方案1】:

    添加这个解决了我的问题,因为我使用它的查询链有一个 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?

    有关该主题的更多信息

    Generics and calling overloaded method from difference class - precedence issue

    【讨论】:

      猜你喜欢
      • 2015-02-26
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多