我有很多实现特定接口的类( 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));
}
答案 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;
}
}