• C#DataTable转List<T>互转


    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Reflection;
    
    namespace BT.Preservation.Models
    {
        public static class ExtendMethod
        {
           /// <summary>
            /// DataTable转成List
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static List<T> ToDataList<T>(this DataTable dt)
            {
                var list = new List<T>();
                var plist = new List<PropertyInfo>(typeof(T).GetProperties());
                foreach (DataRow item in dt.Rows)
                {
                    T s = Activator.CreateInstance<T>();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                        if (info != null)
                        {
                            try
                            {
                                if (!Convert.IsDBNull(item[i]))
                                {
                                    object v = null;
                                    if (info.PropertyType.ToString().Contains("System.Nullable"))
                                    {
                                        v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
                                    }
                                    else
                                    {
                                        v = Convert.ChangeType(item[i],info.PropertyType);
                                    }
                                    info.SetValue(s, v, null);
                                }
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
                            }
                        }
                    }
                    list.Add(s);
                }
                return list;
            }
    
            /// <summary>
            /// DataTable转成Dto
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static T ToDataDto<T>(this DataTable dt)
            {
                T s = Activator.CreateInstance<T>();
                if (dt == null || dt.Rows.Count == 0)
                {
                    return s;
                }
                var plist = new List<PropertyInfo>(typeof(T).GetProperties());
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                    if (info != null)
                    {
                        try
                        {
                            if (!Convert.IsDBNull(dt.Rows[0][i]))
                            {
                                object v = null;
                                if (info.PropertyType.ToString().Contains("System.Nullable"))
                                {
                                    v = Convert.ChangeType(dt.Rows[0][i], Nullable.GetUnderlyingType(info.PropertyType));
                                }
                                else
                                {
                                    v = Convert.ChangeType(dt.Rows[0][i], info.PropertyType);
                                }
                                info.SetValue(s, v, null);
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
                        }
                    }
                }
                return s;
            }
    
            /// <summary>
            /// 将实体集合转换为DataTable
            /// </summary>
            /// <typeparam name="T">实体类型</typeparam>
            /// <param name="entities">实体集合</param>
            public static DataTable ToDataTable<T>(List<T> entities)
            {
                var result = CreateTable<T>();
                FillData(result, entities);
                return result;
            }
    
            /// <summary>
            /// 创建表
            /// </summary>
            private static DataTable CreateTable<T>()
            {
                var result = new DataTable();
                var type = typeof(T);
                foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
                {
                    var propertyType = property.PropertyType;
                    if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                        propertyType = propertyType.GetGenericArguments()[0];
                    result.Columns.Add(property.Name, propertyType);
                }
                return result;
            }
    
            /// <summary>
            /// 填充数据
            /// </summary>
            private static void FillData<T>(DataTable dt, IEnumerable<T> entities)
            {
                foreach (var entity in entities)
                {
                    dt.Rows.Add(CreateRow(dt, entity));
                }
            }
    
            /// <summary>
            /// 创建行
            /// </summary>
            private static DataRow CreateRow<T>(DataTable dt, T entity)
            {
                DataRow row = dt.NewRow();
                var type = typeof(T);
                foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
                {
                    row[property.Name] = property.GetValue(entity) ?? DBNull.Value;
                }
                return row;
            }
        }
    }
  • 相关阅读:
    VBS进程判断
    [转]Myeclipse的使用方法格式化源代码
    Stay hungry,stay foolish
    【转】tomcat 设置 session 过期时间
    【转】Java编码转换问题,new String(str.getByts("ISO88591"), "GBK")的作用
    【转】VBS CHR码值对应列表
    【转】 从MS SQL Server 2000升级到MS SQL Server 2005方法
    【转】SqlServer中decimal(numeric )、float 和 real 数据类型的区别
    html radio
    a标签点击状态
  • 原文地址:https://www.cnblogs.com/zjbky/p/9242140.html
Copyright © 2020-2023  润新知