Objeto de lista de conversión en C #

Necesito lanzar un objeto List a otro objeto List que es una interfaz

public class THold : IHold
{..}

Aquí, IHold es la interfaz.

Quiero hacer esto:

List<THold> hold = new List<THold>();
List<IHold> test = hold;

preguntado el 16 de mayo de 11 a las 17:05

@Fred - ¿Dónde está la diversión en eso? -

@Fred: Puede que tengas razón, pero este no es el lugar para registrar sugerencias. Publíquelo en meta.stackoverflow.com; de esa manera, es posible que cambie algo. -

3 Respuestas

Lo más cerca que vas a llegar es:

List<IHold> test = hold.Cast<IHold>().ToList();

El problema es que no existe un elenco directo. ¿Y si tuviera lo siguiente?

public class THold : IHold { /* ... */ }

public class UHold : IHold { /* ... */ }

Y entonces:

List<THold> holds = new List<THold>();
List<IHold> iholds = (List<IHold>) holds;

iholds.Add(UHold);

Obviamente UHold implementa el IHold interfaz, pero obviamente tampoco se puede agregar a la lista de THold objetos.

contestado el 16 de mayo de 11 a las 21:05

IHold, UHold, todos esperamos para IHold! (lo siento, no pude resistir) - Jeff Mercado

Bueno, List<> no se puede crear en forma no genérica; Supongo que perdió los corchetes en algún lugar al escribir su publicación.

De todos modos, supongo que quieres pasar de un List<THold> a una List<IHold>, o viceversa. De cualquier manera, la mejor opción es el método OfType () de Linq:

List<THold> hold = new List<THold>();
//populate hold with items
List<IHold> test = hold.OfType<IHold>().ToList();

La Cast<>() El método también debería funcionar, sin embargo, siempre que intento usarlo para realizar la tarea indicada, nunca funciona correctamente. Usar Select () con una proyección que proyecta cada elemento también funcionará:

List<IHold> test = hold.Select(x=>(IHold)x).ToList();

contestado el 16 de mayo de 11 a las 21:05

Este patrón de msdn El artículo describe la covarianza y la contravarianza, que son los términos de lo que usted describe.

contestado el 16 de mayo de 11 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.