zoukankan      html  css  js  c++  java
  • List与DataTable互转

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    using System.Reflection;
    using System.Globalization;
    
    namespace DAL
    {
    
        /// <summary>
        /// 将DataTable与List<T>相互装换;
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public class ModelConvertHelper<T> where T : new()
        {
    
            public static List<T> ConvertToModel(DataTable dt)
            {
                try
                {
    
    
                    // 定义集合  
                    List<T> ts = new List<T>();
                    // 获得此模型的类型  
                    Type type = typeof(T);
                    string tempName = "";
                    foreach (DataRow dr in dt.Rows)
                    {
                        T t = new T();
                        // 获得此模型的公共属性  
                        PropertyInfo[] propertys = t.GetType().GetProperties();
                        foreach (PropertyInfo pi in propertys)
                        {
                            tempName = pi.Name;
                            // 检查DataTable是否包含此列  
                            if (dt.Columns.Contains(tempName))
                            {
                                // 判断此属性是否有Setter  
                                if (!pi.CanWrite)
                                    continue;
                                object value = dr[tempName];
                                if (value != DBNull.Value)
                                {
                                    //pi.SetValue(t, value, null);  
                                    pi.SetValue(t, Convert.ChangeType(value, pi.PropertyType, CultureInfo.CurrentCulture), null);
                                }
                            }
                        }
                        ts.Add(t);
                    }
                    return ts;
                }
                catch (Exception)
                {
    
                    return null;
                }
            }
    
    
            public static DataTable ToDataTable<T>(List<T> items)
            {
                var tb = new DataTable(typeof(T).Name);
    
                PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    
                foreach (PropertyInfo prop in props)
                {
                    Type t = GetCoreType(prop.PropertyType);
                    tb.Columns.Add(prop.Name, t);
                }
    
                foreach (T item in items)
                {
                    var values = new object[props.Length];
    
                    for (int i = 0; i < props.Length; i++)
                    {
                        values[i] = props[i].GetValue(item, null);
                    }
    
                    tb.Rows.Add(values);
                }
    
                return tb;
            }
    
    
            /// <summary>
            /// 如果类型为空否则返回基本类型
            /// </summary>
            public static Type GetCoreType(Type t)
            {
                if (t != null && IsNullable(t))
                {
                    if (!t.IsValueType)
                    {
                        return t;
                    }
                    else
                    {
                        return Nullable.GetUnderlyingType(t);
                    }
                }
                else
                {
                    return t;
                }
            }
    
            /// <summary>
            /// 指定类型为空
            /// </summary>
            public static bool IsNullable(Type t)
            {
                return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
            }
        }
    }
  • 相关阅读:
    C#中委托和事件的区别
    Linux centos7 计划任务与日志的管理
    linux shell检查字符串是否是IP
    Linux脚本中$#、$0、$1、$@、$*、$$、$?
    Linux命令学习之shift命令
    CentOS7编写systemd服务脚本
    java数据类型转换
    centos7 升级openssh到openssh-8.3p1版本
    oracle的簇的创建
    oracle 分区表的维护
  • 原文地址:https://www.cnblogs.com/ZeedLee/p/14817658.html
Copyright © 2011-2022 走看看