本文共 3003 字,大约阅读时间需要 10 分钟。
之前写过一篇关于将DataTable转换为ListModel的C#代码博文,但当时的实现方式比较粗糙。后来看到一位前辈的评论后,我重新思考并优化了代码结构。
在此次优化中,我重构了之前的代码,采用了更高效的方式实现DataTable到ListModel的数据转换。以下是具体实现细节:
实现的主要逻辑包括以下几个方面:
以下是具体实现代码:
public static ListConvertToList (DataTable dt){ List list = new List (); Type type = typeof(T); PropertyInfo[] props = type.GetProperties(); foreach (DataRow row in dt.Rows) { object obj = type.Assembly.CreateInstance(type.FullName); foreach (PropertyInfo pi in props) { string tempName = pi.Name; if (dt.Columns.Contains(tempName) && pi.CanWrite) { object value = row[tempName]; if (value != DBNull.Value) { pi.SetValue(obj, value, null); } } } list.Add((T)obj); } return list;}public static List ConvertToList (IDataReader reader) { List list = new List (); Type type = typeof(T); PropertyInfo[] props = type.GetProperties(); while (reader.Read()) { object obj = type.Assembly.CreateInstance(type.FullName); foreach (PropertyInfo pi in props) { string tempName = pi.Name; if (ReaderExists(reader, tempName) && pi.CanWrite) { object value = reader[tempName]; if (value != DBNull.Value) { pi.SetValue(obj, value, null); } } } list.Add((T)obj); } return list; } public static T ConvertToModel (DataRow row) { Type type = typeof(T); PropertyInfo[] props = type.GetProperties(); object obj = type.Assembly.CreateInstance(type.FullName); foreach (PropertyInfo pi in props) { string tempName = pi.Name; if (!string.IsNullOrEmpty(row[tempName].ToString()) && pi.CanWrite) { object value = row[tempName]; if (value != DBNull.Value) { pi.SetValue(obj, value, null); } } } return (T)obj; } public static bool ReaderExists(IDataReader reader, string columnName) { int count = reader.FieldCount; for (int i = 0; i < count; i++) { if (reader.GetName(i).Equals(columnName)) { return true; } } return false; }
ConvertToList<T>(DataTable dt):将DataTable转换为ListModel,适用于已知的表结构。ConvertToList<T>(IDataReader reader):将IDataReader转换为ListModel,适用于动态数据源。ConvertToModel<T>(DataRow row):将DataRow单独转换为模型实例。ReaderExists(IDataReader reader, string columnName):用于检查DataReader中是否存在指定的字段列。Assembly.CreateInstance创建模型实例,支持复杂对象的动态赋值。CanWrite检查属性是否可写,避免赋值失败。DBNull值,确保赋值过程不出错。FieldCount和GetName方法提高字段查找效率。该实现可用于多种反射库,例如:
该实现通过减少反射操作和字段查找次数,显著提升了性能。特别是在处理大量数据时,IDataReader版本的实现比DataTable版本更高效。
如果需要更详细的代码解释或进一步的定制,请随时联系我。
转载地址:http://wqhfk.baihongyu.com/