1. 程式人生 > >List、DataTable和物件互轉,List轉DataTable異常Nullable解決方案

List、DataTable和物件互轉,List轉DataTable異常Nullable解決方案

using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
 
namespace ClassLibrary1 {
    public class DataConvert {
 
        /// <summary>
        /// DataTable轉換List<T>
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> TableToList<T>(DataTable dt) {
            List<T> ret = new List<T>();
            Type type = typeof(T);
            List<string> lstColumns = new List<string>();
            foreach (DataRow dr in dt.Rows) {
                PropertyInfo[] proInfo = type.GetProperties();
                T entity = Activator.CreateInstance<T>();
                foreach (PropertyInfo p in proInfo) {
                    if (!dt.Columns.Contains(p.Name) || dr[p.Name] == null || dr[p.Name] == DBNull.Value)
                        continue;
                    if (p.PropertyType == typeof(DateTime) && Convert.ToDateTime(dr[p.Name]) < Convert.ToDateTime("1753-01-01"))
                        continue;
                    try {
                        object obj = Convert.ChangeType(dr[p.Name], p.PropertyType);
                        p.SetValue(entity, obj, null);
                    } catch {
 
                    }
                }
                ret.Add(entity);
            }
            return ret;
        }
 
        /// <summary>
        /// List<T>轉換DataTable
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static DataTable ListToTable<T>(List<T> list) {
            Type type = typeof(T);
            PropertyInfo[] proInfo = type.GetProperties();
            DataTable dt = new DataTable();
            foreach (PropertyInfo p in proInfo) {
                //型別存在Nullable<Type>時,需要進行以下處理,否則異常
                Type t = p.PropertyType;
                if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>))
                    t = t.GetGenericArguments()[0];
                dt.Columns.Add(p.Name, t);
            }
            foreach (T t in list) {
                DataRow dr = dt.NewRow();
                foreach (PropertyInfo p in proInfo) {
                    object obj = p.GetValue(t);
                    if (obj == null) continue;
                    if (p.PropertyType == typeof(DateTime) && Convert.ToDateTime(obj) < Convert.ToDateTime("1753-01-01"))
                        continue;
                    dr[p.Name] = obj;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }
 
        public static T TableRowToEntity<T>(DataTable dt,int rowIndex) {
            Type type = typeof(T);
            T entity = Activator.CreateInstance<T>();
            if (dt == null) return entity;
            DataRow dr = dt.Rows[rowIndex];
            PropertyInfo[] proInfo = type.GetProperties();
            foreach (PropertyInfo p in proInfo) {
                if (!dt.Columns.Contains(p.Name) || dr[p.Name] == null || dr[p.Name] == DBNull.Value)
                    continue;
                if (p.PropertyType == typeof(DateTime) && Convert.ToDateTime(dr[p.Name]) < Convert.ToDateTime("1753-01-01"))
                    continue;
                try {
                    object obj = Convert.ChangeType(dr[p.Name], p.PropertyType);
                    p.SetValue(entity, obj, null);
                } catch{
 
                }
            }
            return entity;
        }
    }
}


相關推薦

ListDataTable物件,ListDataTable異常Nullable解決方案

using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespace ClassLibrary1 { public class D

java jsonmap(複雜混合型別listmapstring)

其中用到了instanceof,所需的jar包 看例子: package json; import java.util.List; import java.util.Map; import net

python裏面的listtupledict的區別

定義 extend 索引 改變 執行 整數 dict 第一個元素 追加 Dictionary .Dictionary是Python中內置的數據類型之一,他定義了鍵和值之間一對一的關系。 每一個元素都有一個key-value對,整個元素集合用大括號{}括起來。 你可以通過k

python學習:listtupledict

長度 刪除指定元素 但是 內容 指定 insert 指定元素 append 獲取 list:列表、數據類型可以不同 定義:(例) classmates = [‘Michael‘, ‘Bob‘, ‘Tracy‘] 訪問某一元素:(例) classmates[0]表示訪問第一個

Java集合:ListSetMap的區別,ArrayListLinkedList有何區別..........

一、陣列和集合的區別:   陣列是大小固定的,並且同一個陣列只能存放型別一樣的資料(基本型別/引用型別);   集合可以儲存和操作數目不固定的一組資料。 所有的JAVA集合都位於 java.util包中! JAVA集合只能存放引用型別的的資料,不能存放基本資料型別。   陣列和集合相比唯一的有點就是速度

Android ListSetMap的介紹使用

一、前言 Android中常用的資料結構包括List、Set和Map這三大類的集合,其中List和Set屬於Collection。List與Set的區別在於List可以存放重複的資料,但是Set不可以。 Map一般為key-value這樣的對於關係,比如常用的HashMap。 And

java中listsetmap 的區別

List的功能方法   實際上有兩種List: 一種是基本的ArrayList,其優點在於隨機訪問元素,另一種是更強大的LinkedList,它並不是為快速隨機訪問設計的,而是具有一套更通用的方法。   List : 次序是List最重要的特點:它保證維護元素特定的順序。List為Colle

Java基礎知識回顧之四 ----- 集合ListMapSet

linked 訪問速度 因此 比較 foreach循環 代碼示例 的區別 不同的 寫法 前言 在上一篇中回顧了Java的三大特性:封裝、繼承和多態。本篇則來介紹下集合。 集合介紹 我們在進行Java程序開發的時候,除了最常用的基礎數據類型和String對象外,也經常會用到集

C++三種容器:listvectordeque的區別 2018/10/7

在寫C++程式的時候會發現STL是一個不錯的東西,減少了程式碼量,使程式碼的複用率大大提高,減輕了程式猿的負擔。還有一個就是容器,你會發現要是自己寫一個連結串列、佇列,或者是陣列的時候,既要花時間還要操心怎麼去維護,裡面的指標啊,記憶體夠不夠用啊,長度問題,有沒有可能溢位啊等

ListSetMap的區別

一、結構特點 List和Set是儲存單列資料的集合,Map是儲存鍵和值這樣的雙列資料的集合; List中儲存的資料是有順序,並且允許重複; Map中儲存的資料是無序的,其鍵是不能重複的,但是值是可以重複的;Set中儲存的資料是無序的,且不允許有重複,但元素在集合中的位置由元素的has

JAVA中幾種集合(ListSetMap)的區別

Java中的集合包括三大類,它們是Set、List和Map,它們都處於java.util包中,Set、List和Map都是介面,它們有各自的實現類。Set的實現類主要有HashSet和TreeSet,L

Java 語言中 ListSet Map 的區別

List、Set 和 Map 都是實現了 Collection 介面的介面。本文將討論 Java 語言中這三者之間的區別。List Vs Set Vs Map1) 重複性List 允許有重複元素。任何數量的重複元素都可以在不影響現有重複元素的值及其索引的情況下插入到 List

JSON字串物件解決json物件首字母小寫

首先假設有一個實體物件user: private String UserId; @JSONField(name="UserId") private String getUserId (){ return UserId; } private String setUserId(Stri

JAXB實現XMLjava物件以及soapXml物件需要注意的地方

public class JaxbXmlUtil { private static final String DEFAULT_ENCODING = "UTF-8"; /** * pojo轉換成xml 預設編碼UTF-8 */ public static

C++三種容器:listvectordeque的區別

           在寫C++程式的時候會發現STL是一個不錯的東西,減少了程式碼量,使程式碼的複用率大大提高,減輕了程式猿的負擔。還有一個就是容器,你會發現要是自己寫一個連結串列、佇列,或者是陣列的時候,既要花時間還要操心怎麼去維護,裡面的指標啊,記憶體夠不夠用啊,長

listtupledict的for迴圈遍歷

1、對於list 直接for i in list會順序輸出list中所有的值,對於想使用它的編號可以使用列舉(enumerate)函式,如for k, v in enumerate(list),對於兩個list想要依次取相同位置的值,則可以使用zip函式,如for l1,

SimpleDateFormatDateString

imp 容易 小寫 格式 原因 string str -m date 今天在修改bug時遇到一個查詢異常:根據時間段查詢的時候,如果查詢時間段含12點鐘,那麽能查到時間段之外的其他數據; 跟蹤了數據流動發現,前同事寫的程序中,有一處是講前端傳來時間字符串轉為Date的一種時

STL中vectorlistdequemap的區別

map映照容器的元素資料是一個鍵值和一個映照資料組成的,鍵值與映照資料之間具有一一映照的關係。         map映照容器的資料結構是採用紅黑樹來實現的,插入鍵值的元素不允許重複,比較函式只對元素的鍵值進行比較,元素的各項資料可通過鍵值檢索出來。         使用map容器需要標頭檔案包含語句“#

文件後綴名   linux windows 傳文件 文件後綴名

文件後綴名 、linux 和windows 互傳文件 文件後綴名文件後綴名 、linux 和windows 互傳文件文件後綴名在linux 下面 命令 文件 都區分大小寫大寫的 LS 就識別不了 ls 這個命令LANG=en 就顯示成英文linux 和windows 互傳文件首相只能使用遠程工具xs

十一LinuxWindows傳文件用戶配置文件密碼配置文件用戶組管理用戶管理

天才 install gin dd命令 建立 我們 log 永遠 name 十一、Linux和Windows互傳文件、用戶配置文件和密碼配置文件、用戶組管理、用戶管理一、Linux和Windows互傳文件安裝軟件包:yum install -y lrzsz(xshell,s