Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将具体类型的泛型集合转换为基类型的集合_C#_Linq_Generics_Ienumerable - Fatal编程技术网

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

C# 将具体类型的泛型集合转换为基类型的集合,c#,linq,generics,ienumerable,C#,Linq,Generics,Ienumerable,我有许多实现特定接口(ISearchable)的类,我想从静态方法返回基类型(ISearchable)的IEnumerable,但我不确定如何在不进行中间集合的情况下转换它 代码非常简单,其中一个域对象的实现如下: public class account : ISearchable { public static IEnumerable<ISearchable> Search(string keyword) { // ORMVendorCollect

我有许多实现特定接口(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>(); 
    }
}
公共类帐户:ISearchable
{
公共静态IEnumerable搜索(字符串关键字)
{
//ORMVendorCollection实现IQueryable
ORMVendorCollection结果=/*linq查询*/
//如果我将返回类型更改为IEnumerable,这将起作用
//但这会让客户端代码有点难看
返回结果;
//这不起作用,但这是我想要实现的
返回结果;
}
}
客户端代码理想情况下如下所示:

public static IEnumerable<ISearchable> Search(string keyword)
{
    return account.Search(keyword)
        .Concat<ISearchable>(order.Search(keyword))
        .Concat<ISearchable>(otherDomainClass.Search(keyword));
}
公共静态IEnumerable搜索(字符串关键字)
{
返回帐户。搜索(关键字)
.Concat(订单.搜索(关键字))
.Concat(otherDomainClass.Search(关键字));
}
使用
Cast
扩展方法

return results.Cast<ISearchable>();
返回results.Cast();

你就不能这样做吗

public class account : ISearchable 
{ 
    public static IEnumerable<ISearchable> Search(string keyword) 
    { 
        var results = /* linq query */ 
        foreach(var result in results)
            yield return result;
    } 
} 
公共类帐户:ISearchable
{ 
公共静态IEnumerable搜索(字符串关键字)
{ 
变量结果=/*linq查询*/
foreach(结果中的var结果)
收益结果;
} 
} 
对于C#4.0,您可以直接进行强制转换,因为
IEnumerable

返回(IEnumerable)结果;

Variance在3.5框架中工作,只是遗憾的是,您不能拥有语言功能。(但我非常确定您可以构建一个使用方差的类库,并从3.5应用程序中使用它)
return (IEnumerable<ISearchable>)results.AsEnumerable();