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

时间:2010-09-10 17:53:13

标签: c# linq generics ienumerable

我有很多实现特定接口的类( ISearchable ),我想从基类型( ISearchable )返回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 个答案:

答案 0 :(得分:7)

使用Cast<T>扩展方法

return results.Cast<ISearchable>();

答案 1 :(得分:2)

对于C#4.0,您可以直接投射,因为IEnumerable<>covariant

return (IEnumerable<ISearchable>)results.AsEnumerable();

答案 2 :(得分:1)

难道你不能做点什么吗?

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