//List to DataTable
//Here is the extension method to convert a List to a DataTable:
/// <summary>
/// Convert Genric List to DataTable
/// </summary>
public static DataTable ToDataTable<T>(this IList<T> listObject)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
DataTable myTable = new DataTable();
foreach (PropertyDescriptor prop in properties)
{
myTable.Columns.Add(prop.Name, prop.PropertyType);
}
object[] values = new object[properties.Count];
foreach (T item in listObject)
{
for (int i = 0; i < values.Length; i++)
{
values[i] = properties[i].GetValue(item);
}
myTable.Rows.Add(values);
}
return myTable;
}
//DataTable to List<TSource>
/// <summary>
/// Convert DataTable to Genric List
/// </summary>
public static List<T> DataTableMapToList<T>(DataTable dtSource)
{
string propName = string.Empty;
List<T> entityList = new List<T>();
foreach (DataRow dr in dtSource.Rows)
{
// Create Instance of the Type T
T entity = Activator.CreateInstance<T>();
// Get all properties of the Type T
System.Reflection.PropertyInfo[] entityProperties = typeof(T).GetProperties();
// Loop through the properties defined in the
// entityList entity object and mapped the value
foreach (System.Reflection.PropertyInfo item in entityProperties)
{
propName = string.Empty;
if (propName.Equals(string.Empty))
propName = item.Name;
if (dtSource.Columns.Contains(propName))
{
// Assign value to the property
item.SetValue
(
entity,
dr[propName].GetType().Name.Equals(typeof(DBNull).Name) ? null : dr[propName],
null
);
}
}
entityList.Add(entity);
}
return entityList;
}
//====================================================================================================================
/*Converts List To DataTable*/
public static DataTable ToDataTable<TSource>(this IList<TSource> data)
{
DataTable dataTable = new DataTable(typeof(TSource).Name);
PropertyInfo[] props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (PropertyInfo prop in props)
{
dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}
foreach (TSource item in data)
{
var values = new object[props.Length];
for (int i = 0; i < props.Length; i++)
{
values[i] = props[i].GetValue(item, null);
}
dataTable.Rows.Add(values);
}
return dataTable;
}
/*Converts DataTable To List*/
public static List<TSource> ToList<TSource>(this DataTable dataTable) where TSource : new()
{
var dataList = new List<TSource>();
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
var objFieldNames = (from PropertyInfo aProp in typeof(TSource).GetProperties(flags)
select new { Name = aProp.Name,
Type = Nullable.GetUnderlyingType(aProp.PropertyType) ?? aProp.PropertyType }).ToList();
var dataTblFieldNames = (from DataColumn aHeader in dataTable.Columns
select new { Name = aHeader.ColumnName, Type = aHeader.DataType }).ToList();
var commonFields = objFieldNames.Intersect(dataTblFieldNames).ToList();
foreach (DataRow dataRow in dataTable.AsEnumerable().ToList())
{
var aTSource = new TSource();
foreach (var aField in commonFields)
{
PropertyInfo propertyInfos = aTSource.GetType().GetProperty(aField.Name);
propertyInfos.SetValue(aTSource, dataRow[aField.Name], null);
}
dataList.Add(aTSource);
}
return dataList;
}