为通用扩展方法创建重载

时间:2014-03-12 08:45:05

标签: c# generics extension-methods

我创建了以下扩展程序。

代码

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>();

错误

  

无法隐式转换类型&#39; TEntityDto&#39;至   &#39; System.Collections.Generic.IEnumerable&#39 ;.一个明确的   存在转换(你错过了演员吗?)

我原来的解决方案是将以IQueryable作为输入的方法重命名为&#34; MapQuery&#34; ...

但是我想在对象或集合上调用它时具有相同的命名约定。我不确定如何添加约束(或某些东西)来限制调用/源对象应该是什么样子。 (EG。单班/班级集合)

1 个答案:

答案 0 :(得分:0)

添加这个解决了我的问题,因为我使用它的查询链有一个order by,结果对象是IOrderedQueryable,而不是IQueryable。

public static QueryMapper<TSource> Map<TSource>(this IOrderedQueryable<TSource> source) 
{
   return new QueryMapper<TSource>(source); 
}

最后的想法......

我只是想知道为什么&#34; Map(这个TSource obj)&#34;,优先于&#34; Map(这个IQueryable源)&#34;,因为IOrderedQueryable有一个基础IQueryable的类型?

有关该主题的更多信息

  

Generics and calling overloaded method from difference class - precedence issue