IEnumerable a DataSet, Extension Method
Mientras realizaba refactoring en el código base del framework de la compañía que laboro, me surgió la necesidad de transformar una lista genérica List<Objeto> en un DataSet. El código ha sido heredado desde hace algún tiempo y resultaba complicado modificar algunas collecciones customizadas que se realizaron para el proyecto.
Además las aplicaciones futuras necesitan la funcionalidad, bastante útil en tareas administrativas, de transformar una colección a DataSet. Pues encontré algunas fuentes interesantes de información: CodeProject presenta una alternativa bastante interesante, Keith Elder y Sunil Kumar Saini hacen algo similar y hasta StackOverflow está lleno de preguntas al respecto.
Pues yo me quedo con un artículo publicado por Ian Dikes, quien ha creado un método extendido para el objeto IEnumerable que nos permitirá transformar cualquier lista que implemente esta interfaz (IEnumerable) a DataSet.
El método es bastante simple y tomado de base de Keith Elder y su post: Obtener las propiedades y sus tipos, armar el dataset y popularlo para devolverlo luego.... Me tomaré la libertad de copiar el código para compartirlo con todos.
public static class CollectionExtensions
{
public static DataSet ToDataSet (this
IEnumerable collection, string dataTableName)
{
if (collection == null)
{
throw new ArgumentNullException("collection");
}
if (string.IsNullOrEmpty(dataTableName))
{
throw new ArgumentNullException("dataTableName");
}
DataSet data = new DataSet("NewDataSet");
data.Tables.Add(FillDataTable(dataTableName, collection));
return data;
}
private static DataTable FillDataTable (string tableName,
IEnumerable collection)
{
PropertyInfo[] properties = typeof(T).GetProperties();
DataTable dt = CreateDataTable (tableName,
collection, properties);
IEnumerator enumerator = collection.GetEnumerator();
while (enumerator.MoveNext())
{
dt.Rows.Add(FillDataRow (dt.NewRow(),
enumerator.Current, properties));
}
return dt;
}
private static DataRow FillDataRow (DataRow dataRow,
T item, PropertyInfo[] properties)
{
foreach (PropertyInfo property in properties)
{
dataRow[property.Name.ToString()] = property.GetValue(item, null);
}
return dataRow;
}
private static DataTable CreateDataTable (string tableName,
IEnumerable collection, PropertyInfo[] properties)
{
DataTable dt = new DataTable(tableName);
foreach (PropertyInfo property in properties)
{
dt.Columns.Add(property.Name.ToString());
}
return dt;
}
}
Recibe el nombre de la tabla a crear, inclusive se podría modificar para incluir el nombre del DataSet, yo no lo necesitaba. Ahora solo basta invocar el método ToDataSet en cualquier objeto que implementa IEnumerable para obtener el DataSet.
Happy Coding











Interesante
ganadinerodandoclic.blogspot.com