viernes, 5 de junio de 2015

C# - Convertir lista en DataTable

/// <summary>
    ///Convierte Lista en DataTable
    /// </summary>
    /// <param name="items">Lista a convertir de tipo object</param>
    /// <param name="nameService">Nombre a dar al DataTable</param>
    /// <returns></returns>
    public static DataTable ConvertirListaToDataTable(List<object> items, string nameService)
    {
        // Instancia del objeto a devolver
        var returnValue = new DataTable();
        // Información del tipo de datos de los elementos del List
        Type itemsType = items.First().GetType();
        /*Se Recorren las propiedades para crear las columnas del datatable y
        pregunta si el objeto tiene estrcutra.Si tiene entra.*/
        if (itemsType.GetProperties().Any())
        {
            foreach (PropertyInfo prop in itemsType.GetProperties())
            {
                //Se Crea y agrega una columna por cada propiedad de la entidad
                var column = new DataColumn(prop.Name);

                var propType = Nullable.GetUnderlyingType(prop.PropertyType)
                  ?? prop.PropertyType;

                column.DataType = propType;
                returnValue.Columns.Add(column);
            }
            int j;
            /* Se recorre la colección para guardar los datos
             en el DataTable*/
            foreach (var item in items)
            {
                j = 0;
                object[] newRow = new object[returnValue.Columns.Count];
                /* Se vuelve a recorrer las propiedades de cada item para
                 obtener su valor y guardarlo en la fila de la tabla*/
                foreach (PropertyInfo prop in itemsType.GetProperties())
                {
                    newRow[j] = prop.GetValue(item, null);
                    j++;
                }
                returnValue.Rows.Add(newRow);
            }
        }
        //si el objeto no tiene estructura, se arma una.
        else
        {
            var newRow = new object[items.Count];
            for (int i = 0; i < items.Count; i++)
            {
                var colName = nameService + i;
                var column = new DataColumn(colName);
                column.DataType = typeof(string);
                returnValue.Columns.Add(column);
            }
            for (int i = 0; i < items.Count; i++)
            {
                newRow[i] = items[i].ToString();
            }
            returnValue.Rows.Add(newRow);
        }
        // devolución del DataTable
        return returnValue;
    }

No hay comentarios:

Publicar un comentario