2010-09-10 4 views
3

J'ai un certain nombre de classes qui implémentent une interface spécifique (ISearchable) et je voudrais retourner un IEnumerable du type de base (ISearchable) à partir d'une méthode statique, mais je ne suis pas sûr de savoir comment le convertir sans faire de collections intermédiaires.Conversion d'une collection générique d'un type concret en une collection d'un type de base

Le code est assez simple, l'une des implémentations de objets de domaine est comme ceci:

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

Le code client, ressemble parfaitement à ceci:

public static IEnumerable<ISearchable> Search(string keyword) 
{ 
    return account.Search(keyword) 
     .Concat<ISearchable>(order.Search(keyword)) 
     .Concat<ISearchable>(otherDomainClass.Search(keyword)); 
} 

Répondre

7

Utilisez la méthode d'extension Cast<T>

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

Merci Jared. edit: * attend 10 minutes * –

1

Ne pourriez-vous juste faire quelque chose comme?

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

pour C# 4.0, vous pourriez être en mesure de lancer directement, depuis IEnumerable<> est covariant

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

+1 mais hélas, je suis limité à .NET 3.5 pour le moment. –

+0

La variance fonctionne dans le framework 3.5, juste dommage que vous ne puissiez pas avoir les fonctionnalités du langage. (Mais je suis assez sûr que vous pouvez construire une bibliothèque de classes qui utilise la variance, et l'utiliser à partir d'une application 3.5) –

Questions connexes