2011-07-25 26 views
7

Estoy creando un control que recibo en un conjunto de datos de origen de datos o listaConvertir IEnumerable en la lista <T>

Cómo me convierto un IEnumerable para mostrar en un evento CreateChildControls?

protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding) 
{ 
    if (dataSource is System.Data.DataSet) 
    { 
    } 
    else if(dataSource is IList) 
    { 
    } 
} 

Respuesta

12

Por lo general, se podría usar el extensionmethod IEnumerable<T>.ToList() de LINQ pero en su caso no se puede utilizar (de inmediato), ya que tiene la no genérico IEnumerable interfaz. Sou tendrá que emitir primero (también usando LINQ):

datasource.Cast<object>().ToList(); 

No importa lo que en realidad no está en colección original, esto va siempre tienen éxito.

+0

gracias, cómo puedo obtener el tipo original y no establecer un tipo de objeto ? – Pablogrind

+0

En caso de que ese tipo sea siempre el mismo, es tan simple como 'datasource.Cast (). ToList();' En caso de que no lo sea, usted tiene un problema de diseño. Una solución sería darle a todos sus tipos de artículos en su colección una interfaz genérica que contenga todos los miembros que necesita en su método de consumo 'CreateChildControls()', p. 'datasource.Cast () .ToList();' – bitbonk

+0

@ bitbonk: Si su código cae a través de 'datasource is IList', entonces será una lista. No es necesario crear una lista, solo puedes lanzar a una lista. Entonces, el problema del 'formato original' no es un problema –

6

que vuelva a leer su pregunta y parece que usted está recibiendo un conjunto de datos que ya se encuentra una lista o un conjunto de datos, sino que se convierte en una IEnumerable. En este caso, basta con hacer

IList myList = (IList)datasource //will throw exception if invalid 

o

IList myList = datasource as IList //mylist will be null if conversion cannot be made 
+0

'dataSource.ToList()' no funcionará porque dataSource no es del tipo IEnumerable bitbonk

+0

Esto es cierto, lo he editado para reflejarlo. No hay necesidad de crear una nueva lista porque si la prueba 'x es y' sucede, entonces un simple (y) x dará su resultado con un pequeño gasto de procesamiento –

0

Para responder a su pregunta '¿cómo puedo obtener el tipo original y no establecer un tipo de objeto?'.

Todos los tipos de .NET Framework contienen el método GetType para obtener el tipo del objeto especificado. Puede usarlo antes del método ToList.

Cuestiones relacionadas