Elenco cast per elenco

public interface IDic { int Id { get; set; } string Name { get; set; } } public class Client : IDic { } 

Come posso eseguire il cast List su List ?

Non puoi lanciarlo (preservando l’identity framework di riferimento) – non sarebbe sicuro. Per esempio:

 public interface IFruit {} public class Apple : IFruit {} public class Banana : IFruit {} ... List apples = new List(); List fruit = apples; // Fortunately not allowed fruit.Add(new Banana()); // Eek - it's a banana! Apple apple = apples[0]; 

Ora puoi convertire una List in IEnumerable in .NET 4 / C # 4 a causa della covarianza, ma se vuoi una List devi creare una nuova lista. Per esempio:

 // In .NET 4, using the covariance of IEnumerable List fruit = apples.ToList(); // In .NET 3.5 List fruit = apples.Cast().ToList(); 

Ma non è lo stesso che lanciare la lista originale – perché ora ci sono due liste separate . Questo è sicuro, ma è necessario comprendere che le modifiche apportate a una lista non verranno visualizzate nell’altra lista. (Le modifiche agli oggetti a cui si riferiscono gli elenchi saranno ovviamente visibili).

A Cast iterator e .ToList ():

List casted = input.Cast().ToList() farà il trucco.

Inizialmente ho detto che la covarianza avrebbe funzionato, ma come Jon ha giustamente sottolineato; no non lo farà!

E in origine ho anche stupidamente lasciato la chiamata a ToList()

Anch’io ho avuto questo problema e dopo aver letto la risposta di Jon Skeet ho modificato il mio codice usando List per usare IEnumerable . Sebbene ciò non risponda alla domanda originale dell’OP di Come posso eseguire il cast List su List , evita il bisogno di farlo e potrebbe quindi essere utile per gli altri utenti che riscontrano questo problema. Questo ovviamente presuppone che il codice che richiede l’uso di List sia sotto il tuo controllo.

Per esempio:

 public void ProcessIDic(IEnumerable sequence) { // Implementation } 

Invece di:

 public void ProcessIDic(List list) { // Implementation } 

Se puoi usare LINQ, puoi farlo …

 List clientList = new List(); List list = clientList.Select(c => (IDic)c).ToList(); 
 List listOfA = new List(); List list = listOfA.Cast().ToList(); 

È ansible solo creando una nuova List e trasferendo tutti gli elementi.

In .Net 3.5, puoi fare quanto segue:

 List interfaceList = new List(list.Cast()); 

Il costruttore per List in questo caso accetta un object IEnumerable.
l’elenco è tuttavia convertibile solo in IEnumerable. Anche se myObj può essere convertibile in ISomeInterface, il tipo IEnumerable non è convertibile in IEnumerable.