2013-02-25 13 views
8

Ich habe einenConvert Liste Typ IEnumerable Schnittstellen Typ

List<Person> personlist; 

Wie kann ich konvertieren

IEnumerable<IPerson> iPersonList 

Person Implementiert IPerson Schnittstelle

+3

'Liste ' ist ein '' IEnumerable . –

+0

patrickinmpls was versuchst du letztendlich zu tun ..? können Sie versuchen, die 'Cast'-Erweiterung Methode Nachschlagen – MethodMan

Antwort

22

Wenn Sie in .NET 4.0 oder höher sind, können Sie nur eine implizite Umwandlung tun:

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

Dies verwendet allgemeine Kontra in IEnumerable<out T> - also da Sie immer nur etwas aus ein IEnumerable erhalten, können Sie implizit konvertieren IEnumerable<T> zu IEnumerable<U> wenn T : U. (Es verwendet auch, dass List<T> : IEnumerable<T>.)

Andernfalls müssen Sie jedes Element mit LINQ werfen:

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

würde die normale explizite Cast-Syntax arbeiten? Beispiel: (IEnumerable ) personList? Wenn ja/nein, warum? – Freeman

+0

@Freeman Ich habe ein bisschen eine Erklärung hinzugefügt. (Und es ist relativ neu zu C# /. NET.) – Rawling

+0

Vielen Dank, ich habe es jetzt. – Freeman

4

können Sie die Verwendung IEnumerable.Cast

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

@ManishSingh Sie müssen' using System.Linq; ' – juharr

0

Seit .NET 4.0, Sie List<Person> ein Verfahren mit einem Parameter vom Typ IEnumerable<IPerson> ohne implizite passieren können oder explizites Casting.

Implizite Gießen erfolgt automatisch (wenn möglich), dank contravariance

Sie dies tun können:

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 
}