C# List<T> 转 DataTable 方法修改版

打印 上一主题 下一主题

主题 692|帖子 692|积分 2076

之前写了个  List item.toDataTable() 这种链式调用的List转换为DataTable的方法,有两位热心的网友提出了存在的一些缺陷,如果传入的obj参数不是List而是单个object对象或传入的是单类型的List时转换会出错,现对代码进行了些修改,反正代码测试基本是跑通了,对List,单个Object对象,以及List、List这类传入的数据都能转,但还是感觉整个判断过程可能不够严谨,希望高手指正。
之前的代码:C# List 转 DataTable
  1. public static DataTable toDataTable(this object obj,string _tName = null)
  2.         {
  3.             Type t = obj.GetType();
  4.             dynamic ts = obj;
  5.             DataTable DT = new DataTable();
  6.             PropertyInfo[] pi;
  7.             //判断obj是否为单个的实体类
  8.             if (t.Name.IndexOf("List") < 0)
  9.             {
  10.                 pi = ts.GetType().GetProperties(BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);
  11.                 DT.TableName = _tName == null ? ts.GetType().ToString() : _tName;
  12.                 foreach (PropertyInfo p in pi)
  13.                 {
  14.                     DT.Columns.Add(p.Name, p.PropertyType);
  15.                 }
  16.                 DataRow dr1 = DT.NewRow();
  17.                 foreach (PropertyInfo p in pi)
  18.                 {
  19.                     dr1[p.Name] = p.GetValue(ts, null);
  20.                 }
  21.                 DT.Rows.Add(dr1);
  22.                 return DT;
  23.             }
  24.             //判断obj是否为单类型对象
  25.             if (t.ToString().IndexOf("System.String")>=0 || t.ToString().IndexOf("System.Object")>=0
  26.                 || t.ToString().IndexOf("System.Int")>=0 || t.ToString().IndexOf("System.Boolean")>=0)
  27.             {
  28.                 DT.TableName = _tName == null ? "Table1" : _tName;
  29.                 DT.Columns.Add("Column1", typeof(object));
  30.                 foreach (var v in ts)
  31.                 {
  32.                     DataRow dr2 = DT.NewRow();
  33.                     dr2["Column1"] = v ;
  34.                     DT.Rows.Add(dr2);
  35.                 }
  36.                 return DT;
  37.             }
  38.             pi = ts[0].GetType().GetProperties(BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public);            
  39.             DT.TableName = _tName == null ? ts[0].GetType().ToString() : _tName;
  40.             foreach (PropertyInfo p in pi)
  41.             {
  42.                 DT.Columns.Add(p.Name, p.PropertyType);
  43.             }
  44.             DataRow dr = null;
  45.             foreach (var v in ts)
  46.             {
  47.                 dr = DT.NewRow();
  48.                 foreach (PropertyInfo p in pi)
  49.                 {
  50.                     dr[p.Name] = p.GetValue(v, null);
  51.                 }
  52.                 DT.Rows.Add(dr);
  53.             }
  54.             return DT;
  55.         }
复制代码
测试代码:
  1. private static void ReadDataTableFromList()
  2.         {
  3.             ConnConfig conn = new ConnConfig(dbtype: DBType.SQLServer, connstring: SQLConnStr);
  4.             DBHelper<VMIS_model> vioDB = new DBHelper<VMIS_model>(conn);
  5.             List<VMIS_model> list = vioDB.Select(whereSQL: "PlateNumber=@PN", sqlParams: new ORMParameter[]
  6.             {
  7.                 new ORMParameter("@PN","车牌ABCDE")
  8.             });
  9.             Console.WriteLine("List<T>.toDataTable()  测试:");
  10.             DataTable DT = list.toDataTable("List_VMIS");
  11.             Console.WriteLine("数据加载到DataTable 【" + DT.TableName + "】 完成,共载入数据:" + DT.Rows.Count.ToString());
  12.             Console.WriteLine(JsonConvert.SerializeObject(DT, Formatting.Indented));
  13.             Console.WriteLine("----------------------------------------------------------------------");
  14.             Console.WriteLine("单个object.toDataTable() 测试:");
  15.             VMIS_model vi = list.First();
  16.             DT = vi.toDataTable("VMIS");
  17.             Console.WriteLine("数据加载到DataTable 【" + DT.TableName + "】 完成,共载入数据:" + DT.Rows.Count.ToString());
  18.             Console.WriteLine(JsonConvert.SerializeObject(DT, Formatting.Indented));
  19.             Console.WriteLine("----------------------------------------------------------------------");
  20.             Console.WriteLine("List<string>.toDataTable()  测试:");
  21.             List<string> list1 = new List<string>();
  22.             list1.Add("张三");
  23.             list1.Add("李四");
  24.             list1.Add("王五");
  25.             DT = list1.toDataTable("List_String");
  26.             Console.WriteLine("数据加载到DataTable 【" + DT.TableName + "】 完成,共载入数据:" + DT.Rows.Count.ToString());
  27.             Console.WriteLine(JsonConvert.SerializeObject(DT, Formatting.Indented));
  28.             Console.WriteLine("----------------------------------------------------------------------");
  29.             Console.WriteLine("List<int>.toDataTable()  测试:");
  30.             List<int> list2 = new List<int>();
  31.             list2.Add(-2021);
  32.             list2.Add(2022);
  33.             list2.Add(2023);
  34.             DT = list2.toDataTable("List_Int");
  35.             Console.WriteLine("数据加载到DataTable 【" + DT.TableName + "】 完成,共载入数据:" + DT.Rows.Count.ToString());
  36.             Console.WriteLine(JsonConvert.SerializeObject(DT, Formatting.Indented));
  37.             Console.WriteLine("----------------------------------------------------------------------");
  38.             Console.WriteLine("List<long>.toDataTable()  测试:");
  39.             List<long> list3 = new List<long>();
  40.             list3.Add(3232235876000);
  41.             list3.Add(3232235877000);
  42.             list3.Add(-3232235878000);
  43.             DT = list3.toDataTable();
  44.             Console.WriteLine("数据加载到DataTable 【" + DT.TableName + "】 完成,共载入数据:" + DT.Rows.Count.ToString());
  45.             Console.WriteLine(JsonConvert.SerializeObject(DT, Formatting.Indented));
  46.             Console.WriteLine("----------------------------------------------------------------------");
  47.             Console.WriteLine("List<bool>.toDataTable()  测试:");
  48.             List<bool> list4 = new List<bool>();
  49.             list4.Add(true);
  50.             list4.Add(false);
  51.             DT = list4.toDataTable("List_Bool");
  52.             Console.WriteLine("数据加载到DataTable 【" + DT.TableName + "】 完成,共载入数据:" + DT.Rows.Count.ToString());
  53.             Console.WriteLine(JsonConvert.SerializeObject(DT, Formatting.Indented));
  54.             Console.WriteLine("----------------------------------------------------------------------");
  55.             Console.WriteLine("List<object>.toDataTable()  测试:");
  56.             List<object> list5 = new List<object>();
  57.             list5.Add("张三");
  58.             list5.Add(2022);
  59.             list5.Add(-2023);
  60.             list5.Add(3232235877000);
  61.             list5.Add(-3232235878000);
  62.             list5.Add(true);
  63.             list5.Add(false);  
  64.             DT = list5.toDataTable("List_Object");
  65.             Console.WriteLine("数据加载到DataTable 【" + DT.TableName + "】 完成,共载入数据:" + DT.Rows.Count.ToString());
  66.             Console.WriteLine(JsonConvert.SerializeObject(DT, Formatting.Indented));
  67.             Console.WriteLine("----------------------------------------------------------------------");
  68.         }
复制代码
View Code结果:
  1. List<T> to DataTable 转换测试:
  2. ---------------------------------------------
  3. List<T>.toDataTable()  测试:
  4. 数据加载到DataTable 【List_VMIS】 完成,共载入数据:3
  5. [
  6.   {
  7.     "ID": "2105082103590123269484848995",
  8.     "PlateNumber": "车牌ABCDE",
  9.     "V_Text": "超速,超过限速110.00%",
  10.     "V_Address": "超速卡口:xxxxx",
  11.     "V_date": "2021-05-08T21:03:43",
  12.     "CarOwner": ""
  13.   },
  14.   {
  15.     "ID": "2105082103590435798531004957",
  16.     "PlateNumber": "车牌ABCDE",
  17.     "V_Text": "超速,超过限速113.33%",
  18.     "V_Address": "超速卡口:xxxxx",
  19.     "V_date": "2021-05-08T21:03:13",
  20.     "CarOwner": ""
  21.   },
  22.   {
  23.     "ID": "2105082147592512464100535248",
  24.     "PlateNumber": "车牌ABCDE",
  25.     "V_Text": "超速,超过限速83.33%",
  26.     "V_Address": "超速卡口:xxxxx",
  27.     "V_date": "2021-05-08T21:47:50",
  28.     "CarOwner": ""
  29.   }
  30. ]
  31. ----------------------------------------------------------------------
  32. 单个object.toDataTable() 测试:
  33. 数据加载到DataTable 【VMIS】 完成,共载入数据:1
  34. [
  35.   {
  36.     "ID": "2105082103590123269484848995",
  37.     "PlateNumber": "车牌ABCDE",
  38.     "V_Text": "超速,超过限速110.00%",
  39.     "V_Address": "超速卡口:xxxxx",
  40.     "V_date": "2021-05-08T21:03:43",
  41.     "CarOwner": ""
  42.   }
  43. ]
  44. ----------------------------------------------------------------------
  45. List<string>.toDataTable()  测试:
  46. 数据加载到DataTable 【List_String】 完成,共载入数据:3
  47. [
  48.   {
  49.     "Column1": "张三"
  50.   },
  51.   {
  52.     "Column1": "李四"
  53.   },
  54.   {
  55.     "Column1": "王五"
  56.   }
  57. ]
  58. ----------------------------------------------------------------------
  59. List<int>.toDataTable()  测试:
  60. 数据加载到DataTable 【List_Int】 完成,共载入数据:3
  61. [
  62.   {
  63.     "Column1": -2021
  64.   },
  65.   {
  66.     "Column1": 2022
  67.   },
  68.   {
  69.     "Column1": 2023
  70.   }
  71. ]
  72. ----------------------------------------------------------------------
  73. List<long>.toDataTable()  测试:
  74. 数据加载到DataTable 【Table1】 完成,共载入数据:3
  75. [
  76.   {
  77.     "Column1": 3232235876000
  78.   },
  79.   {
  80.     "Column1": 3232235877000
  81.   },
  82.   {
  83.     "Column1": -3232235878000
  84.   }
  85. ]
  86. ----------------------------------------------------------------------
  87. List<bool>.toDataTable()  测试:
  88. 数据加载到DataTable 【List_Bool】 完成,共载入数据:2
  89. [
  90.   {
  91.     "Column1": true
  92.   },
  93.   {
  94.     "Column1": false
  95.   }
  96. ]
  97. ----------------------------------------------------------------------
  98. List<object>.toDataTable()  测试:
  99. 数据加载到DataTable 【List_Object】 完成,共载入数据:7
  100. [
  101.   {
  102.     "Column1": "张三"
  103.   },
  104.   {
  105.     "Column1": 2022
  106.   },
  107.   {
  108.     "Column1": -2023
  109.   },
  110.   {
  111.     "Column1": 3232235877000
  112.   },
  113.   {
  114.     "Column1": -3232235878000
  115.   },
  116.   {
  117.     "Column1": true
  118.   },
  119.   {
  120.     "Column1": false
  121.   }
  122. ]
  123. ----------------------------------------------------------------------
复制代码
View Code 
C# List 转 DataTable - 小政哥01 - 博客园 (cnblogs.com)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表