2010-08-22 4 views
2

J'ai une classe d'objets BusinessObject qui implémente une interface IAlternateInterface. J'ai déjà une méthode qui retournera une liste générique de BusinessObject qui a les objets que je veux mais que je veux les obtenir comme une liste de IAlternateInterface. J'ai essayé de faire quelque chose comme le code psudo suivant mais je reçois un message "Impossible de convertir le type de source ... en type cible ..." dans Visual Studio. Quelle est la meilleure façon de convertir la liste?Conversion de liste C# dans asp.net

public List<BusinessObject> GetObjects(){ 
//logic to get the list 
} 

public List<IAlternateInterface> GetInterfaceObjects(){ 
return GetObjects(); 
} 

Répondre

2

Vous cherchez Enumerable.Cast<TResult>:

GetObjects().Cast<IAlternateInterface>.ToList(); 

Le ToList à la fin est nécessaire que si vous avez besoin d'une liste. Moulage <TResult> retourne un < IEnumerable TResult >

+0

j'ai jeté le code dans mon projet réel rapide à ce c ompiles donc je suis sûr que ça va marcher. Je vais jouer avec le lundi pour m'en assurer, mais je suis à peu près certain que cela fera ce dont j'ai besoin. Merci et les autres personnes qui ont répondu. – William

0

Avec LINQ Cast

public List<IAlternateInterface> GetInterfaceObjects(){ 
return GetObjects().Cast<IAlternateInterface>().ToList(); 
} 
2

Les deux réponses à l'aide Cast sont très bien pour C# 3 et C# 4 ... mais si vous utilisez C# 4 (et .NET 4), vous pouvez également utiliser la variance générique pour éviter une étape:

public List<IAlternateInterface> GetInterfaceObjects(){ 
    return GetObjects().ToList<IAlternateInterface>(); 
} 
+0

L'OP obtient "Impossible de convertir le type de source en type cible", donc ce n'est peut-être pas le C# 4. Mais dans ce cas, ne retournerait-il pas GetObjects(); – Kobi

+0

@Kobi: Non, car 'List ' est invariant. Vous aurez toujours besoin de construire une 'List ' que l'appel de 'ToList' fera - mais il utilisera la conversion implicite de' List 'en IEnumerable ' qui est maintenant disponible. –

+0

Oh, bien sûr! Donc peut-être une solution propre ici est de retourner 'IEnumerable ', mais cela dépend de ce que l'OP a besoin ... Merci. – Kobi