之前用.net敲过一版机房收费系统,就用到过DataTable转泛型。机房重构——DataTable转泛型
这次用C#合作的时候又用到了DataTable转泛型。
不过在时间转换这里,经常出错。因为数据库里面设置的是TimeSpan类型,而实体层里面设置的为String类型,这样利用泛型的时候就会出现“将string类型转换为TimeSpan类型转换失败”。
原先的解决办法,就是将数据库里面的类型也转换为string 类型。不过这次我们是合作,不应该再改动数据库。
于是,利用了下面强制转换的方法,解决了这个问题。
public class ConvertHelper
{
public List<T> convertToList<T>(DataTable dt) where T : new()
{
List<T> ts = new List<T>();
Type Type = typeof(T);
string tempName = string.Empty;
foreach (DataRow dr in dt.Rows)
{
T t = new T();
PropertyInfo[] propertys = t.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (dt.Columns.Contains(tempName))
{
if (!pi.CanWrite) continue;
object value = dr[tempName];
if (pi.PropertyType.Name == "String")
{
value = Convert.ToString(value);
}
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
ts.Add(t);
}
return ts;
}
}
上面代码中这句话,就解决了这个问题。
if (pi.PropertyType.Name == "String")
{
value = Convert.ToString(value);
}
意思就是:如果实体里面的属性为string类型,那么就将value的值强制转换为string类型。
调用转泛型这个方法
ConvertHelper ct = new ConvertHelper();
List<StudentEntity> List = new List<StudentEntity>();
List = ct.convertToList<StudentEntity>(table);
【总结】
解决问题的办法不止一种,要多尝试一些其他的办法。