How to convert datatable to List using c# with generics
First we can start Generic methods creations like below manner
public static List<T> ConvertDataTable<T>(DataTable dt)
{
List<T> lstData = new List<T>();
foreach (DataRow row in dt.Rows)
{
T item = GetInnerItem<T>(row);
lstData.Add(item);
}
return lstData;
}
private static T GetInnerItem<T>(DataRow dr)
{
Type temp = typeof(T);
T obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
{
foreach (PropertyInfo pro in temp.GetProperties())
{
if (pro.Name == column.ColumnName)
{
if (pro.PropertyType == typeof(Int64))
{
var valueToset = dr[column.ColumnName] == DBNull.Value ? 0 : Convert.ToInt64(dr[column.ColumnName]);
pro.SetValue(obj, valueToset, null);
}
else if (pro.PropertyType == typeof(Nullable<Decimal>))
{
var valueToset = dr[column.ColumnName] == DBNull.Value ? 0 : Convert.ToDecimal(dr[column.ColumnName].ToString().Replace(",", ""));
pro.SetValue(obj, valueToset, null);
}
else if (pro.PropertyType == typeof(Nullable<bool>))
{
var valueToset = dr[column.ColumnName] == DBNull.Value ? false : Convert.ToBoolean(dr[column.ColumnName].ToString());
pro.SetValue(obj, valueToset, null);
}
else if (pro.PropertyType == typeof(string))
{
var valueToset = dr[column.ColumnName] == DBNull.Value ? "" : dr[column.ColumnName].ToString();
pro.SetValue(obj, valueToset, null);
}
else if (pro.PropertyType == typeof(Nullable<DateTime>))
{
var valueToset = dr[column.ColumnName] == DBNull.Value ? DateTime.Now : Convert.ToDateTime(dr[column.ColumnName].ToString());
pro.SetValue(obj, valueToset, null);
}
else
{
pro.SetValue(obj, dr[column.ColumnName], null);
}
}
else
continue;
}
}
return obj;
}
Use case:
Public class Program
{
static void Main()
{
DataTable dt=new DataTable();// Here you may fill your data from any other source
List<Employee> lstEmployees= ConvertDataTable<Employee>(dt);
console.Writeline(lstEmployees.count());
console.ReadKey();
}
}
Comments
Post a Comment