C# DataTable 和List之间相互转换的方法
2021-02-15 12:19
阅读:599
首先来说下非泛型转换,这种转换方式就是通过遍历DataTable,然后向Model中的相同字段中赋值即可。
//使用Linq的ToList方法,非泛型
public static List ConvertTo(DataTable dt)
{
if (dt == null) return null;
if (dt.Rows.Count return null;
Listlist = new List ();
list = (from DataRow dr in dt.Rows
select new Entity
{
PID = Int32.Parse(dr["PID"].ToString()),
PName = dr["PName"].ToString(),
PPass = dr["PPass"].ToString(),
PAddr = dr["PAddr"].ToString()
}).ToList();
return list;
}
代码很简单,就是通过循环赋值而已。这里我用的Model测试类如下:
namespace DataSetToEntity.Code
{
public class Entity
{
public int PID { get; set; }
public string PName { get; set; }
public string PPass { get; set; }
public string PAddr { get; set; }
}
}
泛型方式
然后,由于非泛型的版本不具有通用性,所以这里我们准备用泛型版本来实现一下,由于泛型版本是不可预知Model中的属性结构的,所以这里我们需要引入反射来进行操作。
//使用反射的泛型方法一
public static List ConvertTo(DataTable dt) where T : new()
{
if (dt == null) return null;
if (dt.Rows.Count return null;
Listlist = new List ();
try
{
Liststring> columnsName = new Liststring>();
foreach (DataColumn dataColumn in dt.Columns)
{
columnsName.Add(dataColumn.ColumnName);//得到所有的表头
}
list = dt.AsEnumerable().ToList().ConvertAll(row => getObject (row, columnsName)); //转换
return list;
}
catch (Exception ex)
{
return null;
}
}
public static T getObject(DataRow row, Liststring> columnsName) where T : new()
{
T obj = new T();
try
{
string columnname = "";
string value = "";
PropertyInfo[] Properties = typeof(T).GetProperties();
foreach (PropertyInfo objProperty in Properties) //遍历T的属性
{
columnname = columnsName.Find(name => name.ToLower() == objProperty.Name.ToLower()); //寻找可以匹配的表头名称
if (!string.IsNullOrEmpty(columnname))
{
value = row[columnname].ToString();
if (!string.IsNullOrEmpty(value))
{
if (Nullable.GetUnderlyingType(objProperty.PropertyType) != null) //存在匹配的表头
{
value = row[columnname].ToString().Replace("$", "").Replace(",", ""); //从dataRow中提取数据
objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(Nullable.GetUnderlyingType(objProperty.PropertyType).ToString())), null); //赋值操作
}
else
{
value = row[columnname].ToString().Replace("%", ""); //存在匹配的表头
objProperty.SetValue(obj, Convert.ChangeType(value, Type.GetType(objProperty.PropertyType.ToString())), null);//赋值操作
}
}
}
}
return obj;
}
catch
{
return obj;
}
}
上面主要是通过反射获取T的属性名称,然后和DataRow中的表头相匹配,如果匹配的上,就赋值。下面是其简化版本:
//使用反射的泛型方法二
public static List ConvertToEx(DataTable dt) where T : new()
{
if (dt == null) return null;
if (dt.Rows.Count return null;
Listlist = new List ();
Type type = typeof(T);
PropertyInfo[] propertyInfos = type.GetProperties(); //获取泛型的属性
ListlistColumns = dt.Columns.Cast ().ToList(); //获取数据集的表头,以便于匹配
T t;
foreach (DataRow dr in dt.Rows)
{
t = new T();
foreach (PropertyInfo propertyInfo in propertyInfos)
{
try
{
DataColumn dColumn = listColumns.Find(name => name.ToString().ToUpper() == propertyInfo.Name.ToUpper()); //查看是否存在对应的列名
if (dColumn != null)
propertyInfo.SetValue(t, dr[propertyInfo.Name], null); //赋值
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
list.Add(t);
}
return list;
}
至于使用方式,很简单,直接利用下面的代码即可:
Listlist = CommonUtils.ConvertToEx (dt); 引用只做学习用。
文章来自:搜素材网的编程语言模块,转载请注明文章出处。
文章标题:C# DataTable 和List之间相互转换的方法
文章链接:http://soscw.com/index.php/essay/55651.html
文章标题:C# DataTable 和List之间相互转换的方法
文章链接:http://soscw.com/index.php/essay/55651.html
评论
亲,登录后才可以留言!