Comment puis-je convertir une Liste<interface> Liste<béton>?
J'ai une interface définie comme:
public interface MyInterface {
object foo { get; set; };
}
et une classe qui implémente cette interface:
public class MyClass : MyInterface {
object foo { get; set; }
}
J'ai ensuite créer une fonction qui renvoie un ICollection comme suit:
public ICollection<MyClass> Classes() {
List<MyClass> value;
List<MyInterface> list = new List<MyInterface>(
new MyInterface[] {
new MyClass {
ID = 1
},
new MyClass {
ID = 1
},
new MyClass {
ID = 1
}
});
value = new List<MyClass>((IEnumerable<MyClass>) list);
return value;
}
Il serait procédé, mais jeter un
Impossible de convertir l'objet de type
'Système.Les Collections.Génériques.Liste1[MyInterface]'
1[Maclasse]'.
to type
'System.Collections.Generic.IEnumerable
exception. Ce que je fais mal?
Vous devez vous connecter pour publier un commentaire.
Un
List<MyInterface>
ne peut pas être converti enList<MyClass>
en général, parce que la première liste peut contenir des objets qui implémententMyInterface
mais qui ne sont pas réellement des objets de typeMyClass
.Toutefois, puisque dans votre cas, vous savez comment vous avez construit la liste et peut être sûr qu'il ne contient que des
MyClass
objets, vous pouvez le faire à l'aide de Linq:ConvertAll
était une méthode Linq, mais je n'avais pas pris la peine de vérifier.MyClass
objets, vous devez utiliserEnumerable.Cast<TResult>
Méthode, et vous obtiendrez unInvalidCastException
si un élément de la séquence ne peut pas être lancé àMyClass
.Mais un
List<MyInterface>
n'est absolument pas uneList<MyClass>
.Pense:
Puis
Absurde!
Aussi,
Absurde!
Plus
Absurde!
Au lieu de cela, vous pourriez dire
Vous pouvez utiliser
Cast<>
méthode d'extension:Je trouve Automapper très utile pour la conversion des interfaces pour les classes de béton.