2013-02-25 14 views
8

Mamkonwersji na typ IEnumerable interfejsu

List<Person> personlist; 

Jak mogę przekonwertować do

interfejsu
IEnumerable<IPerson> iPersonList 

Person Narzędzia IPerson

+3

'' Lista jest '' IEnumerable . –

+0

patrickinmpls co ostatecznie próbujesz zrobić ..? czy możesz spróbować wyszukać metodę rozszerzenia "Cast" – MethodMan

Odpowiedz

22

Jeśli jesteś w .NET 4.0 lub nowszej, można po prostu zrobić niejawny Obsada:

IEnumerable<IPerson> iPersonList = personlist; 
//or explicit: 
var iPersonList = (IEnumerable<IPerson>)personlist; 

używa rodzajowy kontrawariancji w IEnumerable<out T> - czyli od kiedy tylko kiedykolwiek coś się o IEnumerable, można domyślnie przekonwertować IEnumerable<T> na IEnumerable<U>, jeśli T : U. (Używa się też, że List<T> : IEnumerable<T>.)

W przeciwnym razie trzeba rzucić każdą pozycję za pomocą LINQ:

var iPersonList = personlist.Cast<IPerson>(); 
+0

, czy normalna działająca jawna składnia działa? Przykład: (IEnumerable ) personList? Jeśli tak/nie, to dlaczego? – Freeman

+0

@Freeman Dodałem trochę wyjaśnienia. (I jest stosunkowo nowy w C#/.NET.) – Rawling

+0

Dziękuję, mam to teraz. – Freeman

4

Można użyć IEnumerable.Cast

var iPersonList = personlist.Cast<IPerson>(); 
+0

@ManishSingh Musisz dodać 'using System.Linq;' – juharr

0

Od .NET 4.0, można przekazać List<Person> do metody z parametrem typu IEnumerable<IPerson> bez niejawny lub wyraźne rzucanie.

niejawny odlewania odbywa się automatycznie (jeśli to możliwe), dzięki contravariance

Można to zrobić:

var people = new List<Person>(); 
// Add items to the list 

ProcessPeople(people); // No casting required, implicit cast is done behind the scenes 


private void ProcessPeople(IEnumerable<IPerson> people) 
{ 
// Processing comes here 
}