代码之家  ›  专栏  ›  技术社区  ›  Steven Evers

将具体类型的泛型集合转换为基类型的集合

  •  3
  • Steven Evers  · 技术社区  · 14 年前

    我有很多实现特定接口的类( )我想返回一个基类型的IEnumerable( )从一个静态方法,但我不知道如何转换它而不做中间集合。

    代码非常简单,其中一个域对象的实现如下所示:

    public class account : ISearchable
    {
        public static IEnumerable<ISearchable> Search(string keyword)
        {
            // ORMVendorCollection<T> implements IQueryable<T>
            ORMVendorCollection<account> results = /* linq query */
    
            // this works if I change the return type to IEnumerable<account>
            // but it uglifies client code a fair bit
            return results.AsEnumerable<account>();
    
            // this doesn't work, but it's what I'd like to achieve            
            return results.AsEnumerable<ISearchable>(); 
        }
    }
    

    理想情况下,客户端代码如下所示:

    public static IEnumerable<ISearchable> Search(string keyword)
    {
        return account.Search(keyword)
            .Concat<ISearchable>(order.Search(keyword))
            .Concat<ISearchable>(otherDomainClass.Search(keyword));
    }
    
    3 回复  |  直到 14 年前
        1
  •  7
  •   JaredPar    14 年前

    使用 Cast<T> 扩展方法

    return results.Cast<ISearchable>();
    
        2
  •  2
  •   Mark H    14 年前

    IEnumerable<> covariant

    return (IEnumerable<ISearchable>)results.AsEnumerable();
    
        3
  •  1
  •   zero323 little_kid_pea    11 年前

    你就不能这样做吗?

    public class account : ISearchable 
    { 
        public static IEnumerable<ISearchable> Search(string keyword) 
        { 
            var results = /* linq query */ 
            foreach(var result in results)
                yield return result;
        } 
    }