C# DataTable转实体类

更新时间:2020-05-01 22:56
public static class DataTableExtensions
{
    /// <summary>
    ///  dataTable转实体 注意dataTable列要与实体类数据类型一样
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="table"></param>
    /// <returns></returns>
    public static T ToEntity<T>(this DataTable table) where T : new()
    {
        T entity = new T();
        foreach (DataRow row in table.Rows)
        {
            foreach (var item in entity.GetType().GetProperties())
            {
                if (row.Table.Columns.Contains(item.Name))
                {
                    if (DBNull.Value != row[item.Name])
                    {
                        Type newType = item.PropertyType;
                        //判断type类型是否为泛型,因为nullable是泛型类,
                        if (newType.IsGenericType
                                && newType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类
                        {
                            //如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
                            System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(newType);
                            //将type转换为nullable对的基础基元类型
                            newType = nullableConverter.UnderlyingType;
                        }

                        item.SetValue(entity, Convert.ChangeType(row[item.Name], newType), null);

                    }

                }
            }
        }

        return entity;
    }

    public static List<T> ToEntities<T>(this DataTable table) where T : new()
    {
        List<T> entities = new List<T>();
        if (table == null)
            return null;
        foreach (DataRow row in table.Rows)
        {
            T entity = new T();
            foreach (var item in entity.GetType().GetProperties())
            {
                if (table.Columns.Contains(item.Name))
                {
                    if (DBNull.Value != row[item.Name])
                    {
                        Type newType = item.PropertyType;
                        //判断type类型是否为泛型,因为nullable是泛型类,
                        if (newType.IsGenericType
                                && newType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))//判断convertsionType是否为nullable泛型类
                        {
                            //如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
                            System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(newType);
                            //将type转换为nullable对的基础基元类型
                            newType = nullableConverter.UnderlyingType;
                        }
                        item.SetValue(entity, Convert.ChangeType(row[item.Name], newType), null);
                    }
                }
            }
            entities.Add(entity);
        }
        return entities;
    }
}