将一个具体类型的通用集合转换为基础类型的集合

3

我有许多实现特定接口(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个回答

7

使用Cast<T>扩展方法

return results.Cast<ISearchable>();

2

对于C# 4.0版本,由于IEnumerable<>协变的,因此您可以直接进行转换。

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

方差在3.5框架中可以使用,只是很遗憾你不能使用语言特性。(但我相信你可以构建一个使用方差的类库,并从3.5应用程序中利用它) - Mark H

1

你不能只是做类似这样的事情吗?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接