2010-09-10 119 views
3

我有許多實現特定接口的類(ISearchable),我想返回IEnumerable的基類型( ISearchable),但我不知道如何進行轉換而不進行中間集合。將具體類型的通用集合轉換爲基類型的集合

的代碼非常簡單,域對象的實現方式之一,是像這樣:

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)); 
} 

回答

7

使用Cast<T>擴展方法

return results.Cast<ISearchable>(); 
+0

謝謝賈裏德。編輯:*等待10分鐘* – 2010-09-10 17:57:12

1

難道你不能只是做一些像?

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

對於C#4.0中,你可以直接投,因爲IEnumerable<>covariant

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

+1但唉,我目前僅限於.NET 3.5。 – 2010-09-10 18:09:58

+0

差異在3.5框架中起作用,不幸的是你不能擁有語言功能。 (但我敢肯定,你可以建立一個使用差異的類庫,並從3.5應用程序中使用它) – 2010-09-10 18:13:51

相關問題