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