博客
关于我
利用反射把数据库查询到的数据转换成Model、List(改良版)
阅读量:797 次
发布时间:2023-03-29

本文共 3003 字,大约阅读时间需要 10 分钟。

之前写过一篇关于将DataTable转换为ListModel的C#代码博文,但当时的实现方式比较粗糙。后来看到一位前辈的评论后,我重新思考并优化了代码结构。

DataTable到ListModel的C#实现优化

在此次优化中,我重构了之前的代码,采用了更高效的方式实现DataTable到ListModel的数据转换。以下是具体实现细节:

1. 代码逻辑概述

实现的主要逻辑包括以下几个方面:

  • 动态模型实例的创建:使用Reflection API创建动态模型实例。
  • 属性赋值:通过遍历模型的属性,逐一赋值对应的数据字段值。
  • DBNull处理:检查赋值的值是否为DBNull,避免赋值错误。
  • 数据读取优化:通过DataReader的FieldCount和GetName方法优化字段查找。

2. 代码实现

以下是具体实现代码:

public static List
ConvertToList
(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; }

3. 代码解释

  • ConvertToList<T>(DataTable dt):将DataTable转换为ListModel,适用于已知的表结构。
  • ConvertToList<T>(IDataReader reader):将IDataReader转换为ListModel,适用于动态数据源。
  • ConvertToModel<T>(DataRow row):将DataRow单独转换为模型实例。
  • ReaderExists(IDataReader reader, string columnName):用于检查DataReader中是否存在指定的字段列。

4. 优化要点

  • 动态模型实例的创建:使用Assembly.CreateInstance创建模型实例,支持复杂对象的动态赋值。
  • 属性赋值优化:通过CanWrite检查属性是否可写,避免赋值失败。
  • DBNull处理:严格检查DBNull值,确保赋值过程不出错。
  • DataReader优化:通过FieldCountGetName方法提高字段查找效率。

5. 应用场景

  • 数据迁移:用于将已有数据库中的表数据迁移到新模型中。
  • 实时数据同步:适用于实时从数据源读取并转换为模型实例。
  • 模型更新:用于将现有数据源中的数据实时更新到新模型中。

6. 开源项目支持

该实现可用于多种反射库,例如:

  • Castle.Windsor:用于依赖注入框架的动态模型绑定。
  • Unity:支持Unity的依赖注入框架。
  • 其他反射库:可根据项目需求选择合适的反射工具。

7. 性能优化

该实现通过减少反射操作和字段查找次数,显著提升了性能。特别是在处理大量数据时,IDataReader版本的实现比DataTable版本更高效。

如果需要更详细的代码解释或进一步的定制,请随时联系我。

转载地址:http://wqhfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现字符串manacher马拉车算法(附完整源码)
查看>>
Objective-C实现字符串wildcard pattern matching通配符模式匹配算法(附完整源码)
查看>>
Objective-C实现字符串word patterns单词模式算法(附完整源码)
查看>>
Objective-C实现字符串Z 函数或 Z 算法(附完整源码)
查看>>
Objective-C实现字符串加解密(附完整源码)
查看>>
Objective-C实现字符串反转(附完整源码)
查看>>
Objective-C实现字符串复制功能(附完整源码)
查看>>
Objective-C实现字符串是否回文Palindrome算法 (附完整源码)
查看>>
Objective-C实现字符串查找子串(附完整源码)
查看>>
Objective-C实现完整的ComplexNumber复数类(附完整源码)
查看>>
Objective-C实现实现rabin karp算法(附完整源码)
查看>>
Objective-C实现对图像进行色调处理算法(附完整源码)
查看>>
Objective-C实现对称矩阵压缩存储(附完整源码)
查看>>
Objective-C实现寻找欧拉路径/回路(附完整源码)
查看>>
Objective-C实现导弹跟踪算法(附完整源码)
查看>>
Objective-C实现将 base64 字符串转换为字节数组算法(附完整源码)
查看>>
Objective-C实现将位转换为浮点数bitsToFloat算法(附完整源码)
查看>>
Objective-C实现将列表向右旋转 k 个位置算法(附完整源码)
查看>>
Objective-C实现将字符串中大写字母转换为小写字母(附完整源码)
查看>>
Objective-C实现将字符串从一个基转换为另一个基算法(附完整源码)
查看>>