DataTable转换成List

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

 /// 
/// DataTable转成实体
/// 
public static class Table2Model
{
    #region 公共方法(扩展DataTable)

    /// 
    ///  DataTable转换成T
    /// 
    /// 实体类型
    /// 需转换的数据table
    /// 
    public static T ToModel(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;
    }

    /// 
    ///  DataTable转换成T
    /// 
    /// 实体类型
    /// 需转换的数据table
    /// 外延表重名需加的前缀
    /// 
    public static T ToModel(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;
    }

    /// 
    ///  DataTable转换成List
    /// 
    /// 实体类型
    /// 需转换的数据table
    /// 
    public static List ToModelList(this DataTable table) where T : new()
    {
        List entities = new List();

        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<>)

    /// 
    /// 类型转换(包含Nullable<>和非Nullable<>转换)
    /// 
    /// 
    /// 
    /// 
    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<>)
}

你可能感兴趣的:(C#高级编程)