2012-07-27 9 views
10

Tengo un List<BaseClass> con miembros en él. Me gustaría lanzar la lista (y todos sus miembros específicamente) a un tipo List<ChildClass>, donde ChildClass hereda BaseClass. Sé que puedo obtener el mismo resultado a través de un foreach:Casting populated List <BaseClass> a la lista <ChildClass>

List<ChildClass> ChildClassList = new List<ChildClass>(); 
foreach(var item in BaseClassList) 
{ 
    ChildClassList.Add(item as ChildClass); 
} 

Pero hay una manera más limpia de hacer esto? Nota: esto se hace en la plataforma WP7.

Respuesta

18

Usted puede hacer esto si usted es realmente que todos los artículos son moldeables:

ChildClassList = BaseClassList.Cast<ChildClass>().ToList(); 

Su código actual añade null si un elemento BaseClass no se puede convertir a ChildClass. Si eso era realmente su intención, esto sería equivalente:

ChildClassList = BaseClassList.Select(x => x as ChildClass).ToList(); 

pero prefiero sugiere esto, que incluye la verificación de tipos y saltará artículos que no coinciden:

ChildClassList = BaseClassList.OfType<ChildClass>().ToList(); 
+0

Pruebe la manera de Botz ... –

+0

Gracias - en este caso estoy seguro de que cada elemento es del tipo especificado. He dividido mis modelos en versiones "tontas" (solo propiedades) y "inteligente" (todas las funcionalidades), donde las clases inteligentes heredan a los tontos. El primer ejemplo aquí funcionó como debería: ¡gracias por la ayuda! Eso va para ti también @ Adam Houldsworth –

3

La siguiente es casi equivalente a su código actual (lo único que falta es que no aporta valores nulos para lances fallidos):

var childList = baseList.OfType<ChildClass>().ToList(); 

Esto igno Reinstancias donde la lista contiene otra clase derivada que no sea ChildClass.

También puede utilizar:

var childList = baseList.Cast<ChildClass>().ToList(); 

Pero esto va a lanzar una InvalidCastException en cosas que no puede emitidos.

Cuestiones relacionadas