DataTable转换成List<Model>

来源:互联网 发布:传输层协议端口号 编辑:程序博客网 时间:2024/06/05 13:27

在开发的过程中,需要将DataTable转化为实体,这样的话可以通过属性直接点出来名称,减少dt[“Name”]出错的概率。

 /// <summary>/// DataTable转成实体/// </summary>public static class Table2Model{    #region 公共方法(扩展DataTable)    /// <summary>    ///  DataTable转换成T    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="table">需转换的数据table</param>    /// <returns></returns>    public static T ToModel<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])                    {                        item.SetValue(entity, ChangeType(row[item.Name], item.PropertyType), null);                    }                }            }        }        return entity;    }    /// <summary>    ///  DataTable转换成T    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="table">需转换的数据table</param>    /// <param name="ext">外延表重名需加的前缀</param>    /// <returns></returns>    public static T ToModel<T>(this DataTable table, string ext) 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(ext + item.Name))                {                    if (DBNull.Value != row[ext + item.Name])                    {                        item.SetValue(entity, ChangeType(row[ext + item.Name], item.PropertyType), null);                    }                }            }        }        return entity;    }    /// <summary>    ///  DataTable转换成List<T>    /// </summary>    /// <typeparam name="T">实体类型</typeparam>    /// <param name="table">需转换的数据table</param>    /// <returns></returns>    public static List<T> ToModelList<T>(this DataTable table) where T : new()    {        List<T> entities = new List<T>();        foreach (DataRow row in table.Rows)        {            T entity = new T();            foreach (var item in entity.GetType().GetProperties())            {                if (row.Table.Columns.Contains(item.Name))                {                    if (DBNull.Value != row[item.Name])                    {                        item.SetValue(entity, ChangeType(row[item.Name], item.PropertyType), null);                    }                }            }            entities.Add(entity);        }        return entities;    }    #endregion 公共方法(扩展DataTable)    #region 私有方法(Convert.ChangeType处理Nullable<>和非Nullable<>)    /// <summary>    /// 类型转换(包含Nullable<>和非Nullable<>转换)    /// </summary>    /// <param name="value"></param>    /// <param name="conversionType"></param>    /// <returns></returns>    private static object ChangeType(object value, Type conversionType)    {        // Note: This if block was taken from Convert.ChangeType as is, and is needed here since we're        // checking properties on conversionType below.        if (conversionType == null)        {            throw new ArgumentNullException("conversionType");        } // end if        // If it's not a nullable type, just pass through the parameters to Convert.ChangeType        if (conversionType.IsGenericType &&          conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))        {            if (value == null)            {                return null;            } // end if            // It's a nullable type, and not null, so that means it can be converted to its underlying type,            // so overwrite the passed-in conversion type with this underlying type            System.ComponentModel.NullableConverter nullableConverter = new System.ComponentModel.NullableConverter(conversionType);            conversionType = nullableConverter.UnderlyingType;        } // end if        // Now that we've guaranteed conversionType is something Convert.ChangeType can handle (i.e. not a        // nullable type), pass the call on to Convert.ChangeType        return Convert.ChangeType(value, conversionType);    }    #endregion 私有方法(Convert.ChangeType处理Nullable<>和非Nullable<>)}
0 0
原创粉丝点击