Conversion Between DataTable and List in C#

1.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;
 }

2.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);
            var value = (dataRow[aField.Name] == DBNull.Value) ?
            null : dataRow[aField.Name]; //if database field is nullable
            propertyInfos.SetValue(aTSource, value, null);
        }
        dataList.Add(aTSource);
    }
    return dataList;
}
posted @ 2016-05-04 23:50  BornReady  阅读(161)  评论(0编辑  收藏  举报