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

Ste*_*ers 3 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>(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public static IEnumerable<ISearchable> Search(string keyword)
{
    return account.Search(keyword)
        .Concat<ISearchable>(order.Search(keyword))
        .Concat<ISearchable>(otherDomainClass.Search(keyword));
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 7

使用Cast<T>扩展方法

return results.Cast<ISearchable>();
Run Code Online (Sandbox Code Playgroud)