在循环一个DataTable的时候,还要指定列名,的确有些不方便,今日想能不能转换为类似List<Model>的形式呢,这样操作会方便的多。主要代码为类ModelConvertHelper,主要思路是利用泛型传入实体类Model,DataTable的每一行都是一个实体,所以首先要循环DataTable,定义此泛型的对象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);
}
}
判断如果传入的DataTable和实体类的字段一致的话,就把此值赋给上面新定义的泛型对象t。最后ts.Add(t);把此t加入集合
完整代码及使用方式如下:
运行结果:
学号:001,姓名:张三学号:002,姓名:李四
注意:
1、在上面的代码中,
pi.SetValue(t, value, null);最好写成以下形式:
pi.SetValue(t, Convert.ChangeType(value, pi.PropertyType, CultureInfo.CurrentCulture), null);
2、数字不能为泛型,否则出现以下错误
类型“System.String”的对象无法转换为类型“System.Nullable`1[System.Int32]”。
当然这里是可以,原因是在增加列的同时指定了数据类型,如下代码,如果不指定数据类型就会出现错误
dt.Columns.Add("StuAge", Type.GetType("System.Int32"));
但是我们在实际开发的时候,一般是系统默认指定,而没有指定列类型。所以最好在你的Model层把数字为泛型的地方都取消,如上面的public int? StuAge { get; set; } 最好写为public int StuAge { get; set; }
参考:http://www.xueit.com/html/2009-09/21_4465_00.html