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

来源:互联网 发布:网络阅卷答题卡 编辑:程序博客网 时间:2024/03/28 18:38

前言:

用三层开发的时候,D层经常会用到把DataTable对象转换为List对象的问题,一般情况下我们都会用到一个TableToList()方法,之前都是照着网上敲得,完了大致看一下就开始用了,也没出什么问题,也就没有仔细研究,这次用这个方法转换的时候遇到了一个异常(如题),出来混迟早要还的,这次让我重新研究了一下这个方法。

方法思路:

简单了解一下TableToList()方法的思路。
1. 初始化一个List对象,获取到T所有的属性,
2. 初始化一个T对象 遍历所有属性,
3. 如果DataTable中含有相应属性的值则为T对象赋值,如果没有对应的列则检查数据模型是否定义有误(属性名与列名比较时不区分大小写)
4. 将T对象添加到List对象中

遇到的问题

这里写图片描述
    我也是很奇怪,我的plan_flag字段在前边明明传进去的就是int32的,到这里怎么成了int64不能转换成int32位了。
    根据之前的思路和异常出现的地方,问题出在给对象的属性赋值这步。
    因为转换时在DataTable里某个字段类型是Int32会有问题,报异常,所以我们可在赋值的时候加一个判断:

//加一重if判断,如果属性值是int32类型的,就进行一次强制转换if(pi.GetMethod.ReturnParameter.ParameterType.Name == "Int32"){value = Convert.ToInt32(value);}pi.SetValue(t, value, null);

完整的方法

    /// <summary>    /// DataTable转换为List    /// </summary>    /// <typeparam name="T">实体对象</typeparam>    /// <param name="dt">datatable表</param>    /// <returns>返回list集合</returns>        public List<T> TableToList<T>(DataTable dt) where T : new()        {            //定义集合            List<T> list = new List<T>();            //获得此模型的类型            Type type = typeof(T);            //定义一个临时变量            string tempName = string.Empty;            //遍历Datatable中所有的数据行            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)                        {                         //加一重if判断,如果属性值是int32类型的,就进行一次强制转换                           if(pi.GetMethod.ReturnParameter .ParameterType.Name=="Int32")                            {                                value = Convert.ToInt32(value);                            }                            pi.SetValue(t, value, null);                        }                    }                }                //对象添加到泛型集合中                list.Add(t);            }            return list;        }

总结

还是多一点了解比较好,知其然也要之前所以然,要不然出问题的时候找不到问题原因,更找不到解决方法。

阅读全文
0 0
原创粉丝点击