首页 > 代码库 > 将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。

将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。

可以利用反射将DataTable转换为List<T>对象:原始链接http://www.jb51.net/article/67386.htm

但是该方法在DataTable里某个字段类型是Int32会有问题,报异常:类型“System.Int64”的对象无法转换为类型“System.Int32”。

可在赋值的时候加一句:

if(pi.GetMethod.ReturnParameter.ParameterType.Name == "Int32")
{
value = http://www.mamicode.com/Convert.ToInt32(value);
}
pi.SetValue(t, value, null);

整体代码:

 1 /// <summary> 
 2 /// 利用反射将DataTable转换为List<T>对象
 3 /// </summary> 
 4 /// <param name="dt">DataTable 对象</param> 
 5 /// <returns>List<T>集合</returns> 
 6 public static List<T> DataTableToList<T>(DataTable dt) where T : class, new()
 7 {
 8 // 定义集合 
 9 List<T> ts = new List<T>();
10 //定义一个临时变量 
11 string tempName = string.Empty;
12 //遍历DataTable中所有的数据行 
13 foreach (DataRow dr in dt.Rows)
14 {
15 T t = new T();
16 // 获得此模型的公共属性 
17 PropertyInfo[] propertys = t.GetType().GetProperties();
18 //遍历该对象的所有属性 
19 foreach (PropertyInfo pi in propertys)
20 {
21 tempName = pi.Name;//将属性名称赋值给临时变量 
22 //检查DataTable是否包含此列(列名==对象的属性名) 
23 if (dt.Columns.Contains(tempName))
24 {
25 //取值 
26 object value =http://www.mamicode.com/ dr[tempName];
27 //如果非空,则赋给对象的属性 
28 if (value != DBNull.Value)
29 {
30 if (pi.GetMethod.ReturnParameter.ParameterType.Name == "Int32")
31 {
32 value =http://www.mamicode.com/ Convert.ToInt32(value);
33 }
34 pi.SetValue(t, value, null);
35 }
36 }
37 }
38 //对象添加到泛型集合中 
39 ts.Add(t);
40 }
41 return ts;
42 }

 

其他类型转换汇总

 1 public static  List<T> ToList<T>(this DataTable dt) where T:class,new()
 2 {
 3 Type t=typeof(T);
 4 PropertyInfo[] propertys = t.GetProperties();
 5 List<T> lst = new List<T>();
 6 string typeName = string.Empty;
 7 foreach (DataRow dr in dt.Rows)
 8 {
 9 T entity = new T();
10 foreach (PropertyInfo pi in propertys)
11 {
12 typeName = pi.Name;
13 if (dt.Columns.Contains(typeName))
14 {
15 if (!pi.CanWrite) continue;
16 object value =http://www.mamicode.com/ dr[typeName];
17 if (value =http://www.mamicode.com/= DBNull.Value) continue;
18 if (pi.PropertyType == typeof(string))
19 {
20 pi.SetValue(entity,value.ToString(),null);
21 }
22 else if (pi.PropertyType == typeof(int) || pi.PropertyType == typeof(int?))
23 {
24 pi.SetValue(entity,int.Parse(value.ToString()), null);
25 }
26 else if (pi.PropertyType == typeof(DateTime?) || pi.PropertyType == typeof(DateTime))
27 {
28 pi.SetValue(entity, DateTime.Parse(value.ToString()), null);
29 }
30 else if (pi.PropertyType == typeof(float))
31 {
32 pi.SetValue(entity, float.Parse(value.ToString()), null);
33 }
34 else if (pi.PropertyType == typeof(double))
35 {
36 pi.SetValue(entity, double.Parse(value.ToString()), null);
37 }
38 else
39 {
40 pi.SetValue(entity,value, null);
41 }
42 }
43 }
44 lst.Add(entity);
45 }
46 return lst;
47 }

 

将DataTable转换为List<T>对象遇到问题:类型“System.Int64”的对象无法转换为类型“System.Int32”。