数据表转换实例

#region 数据表转换对象列表
        /// <summary>
        /// 数据表转换对象列表
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="_">数据表</param>
        /// <returns></returns>
        public static List<T> ToList<T>(this DataTable _)
        {
            List<T> list = new List<T>();
            if (_ == null || _.Rows.Count == 0) return list;
            T model = default(T);
            Type _t = typeof(T);
            _.Rows.Each<DataRow>(dr =>
            {
                int f = 0;
                if (_t.IsValueType)
                {
                    if (_t.IsEnum)
                        list.Add(dr[0].ToEnum<T>());
                    else if (_t.Namespace == "System" && _t.IsPublic)
                        list.Add(dr[0].ToCast<T>());
                    else
                        f = 1;
                }
                else if (_t.Name == "String")
                    list.Add(dr[0].ToCast<T>());
                else if (_t.IsClass) f = 2;
                if (f > 0)
                {
                    model = Activator.CreateInstance<T>();
                    foreach (DataColumn dc in dr.Table.Columns)
                    {
                        object drValue = dr[dc.ColumnName];
                        if (drValue == null || Convert.IsDBNull(drValue)) continue;
                        PropertyInfo pi = _t.GetProperty(dc.ColumnName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                        if (pi == null)
                        {
                            object m = model;
                            FieldInfo fi = _t.GetField(dc.ColumnName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
                            if (fi != null && fi.IsPublic)
                            {
                                Type _Field = fi.FieldType;
                                if (_Field.ToString().isPattern(@"System.Boolean")) drValue = drValue.ToString().ToBoolean();
                                if (_Field.IsGenericType && _Field.GetGenericTypeDefinition() == typeof(Nullable<>))
                                {
                                    _Field = _Field.GetGenericArguments()[0];
                                    drValue = Convert.ChangeType(drValue, _Field);
                                }
                                fi.SetValue(m, drValue);
                                model = (T)m;
                            }
                        }
                        else
                        {
                            Type _Field = pi.PropertyType;
                            if (_Field.ToString().isPattern(@"System.Boolean")) drValue = drValue.ToString().ToBoolean();
                            if (_Field.IsGenericType && _Field.GetGenericTypeDefinition() == typeof(Nullable<>))
                            {
                                _Field = _Field.GetGenericArguments()[0];
                                drValue = Convert.ChangeType(drValue, _Field);
                            }
                            if (pi.CanWrite) pi.SetValue(model, drValue, null);
                        }
                    }
                    list.Add(model);
                }
            });
            return list;
        }
        /// <summary>
        /// 数据表转换对象列表
        /// </summary>
        /// <typeparam name="T">对象</typeparam>
        /// <param name="_">数据表</param>
        /// <returns></returns>
        public static T ToEntity<T>(this DataTable _)
        {
            var list = _.ToList<T>();
            if (list == null || list.Count == 0) return default(T);
            return list[0];
        }
        #endregion
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值