在C#中有些地方我们会用到DatatTable类型的返回值,但是这样做的缺点就是,必须知道DataTable中的每个列的值,这样我们才能得到我们所想要的,所以说在此时我们引入了泛型,这样我们不用知道每一列的名字是什么就可以知道我们所需要的实体的哪一个属性。
在这里我只是用到了DataTable转泛型,当然其他的类型的值也是可以的。
public class ConvertHelper<T> where T : new()
{
public static IList<T> ConvertToModel(DataTable dt)
{
IList<T> ts = new List<T>();//定义集合
Type type = typeof(T);//获得此模型的类型
string tempName = "";
//遍历DataTable的所有的行
foreach (DataRow dr in dt.Rows)
{
T t = new T();//获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();//定义属性集合
foreach (PropertyInfo pi in propertys)//遍历pi的所有的属性
{
tempName = pi.Name;//将属性名称赋值给临时变量
if (dt.Columns.Contains(tempName))//检查DataTable是否包含此列
{
//判断此属性是否有Setter
if (!pi.CanWrite)//判断属性是否可写,如果不可写,跳出本次循环
continue;
object value = dr[tempName];//取值
if (value != DBNull.Value)//如果非空
pi.SetValue(t, value.ToString().Trim(), null);//将值赋到t中
}
}
ts.Add(t);//对象添加到泛型集合中
}
return ts;
}
在这个基础上我建立了相应的实体层,来对应相应的属性。