如何使用反射动态处理列表并将返回数据转为列表,解决读库数据重复问题
反射生成实体列表重复值问题修复方案
问题原因
你定义的实体实例instance是在循环外创建的,由于类是引用类型,列表Add操作实际存储的是实例的内存引用地址,而非实体的副本。后续每次循环修改的都是同一个实例的属性值,最终列表中所有元素都指向同一个实例,就会出现全量数据被最后一行覆盖的重复问题。
修复代码
将实例创建逻辑迁移到while循环内部,每次读取行数据时都生成全新的实体实例,同时可以将反射读取属性的逻辑提到循环外优化性能,避免每次循环重复执行反射操作:
// 提前获取所有属性,避免循环内重复反射,优化性能 var properties = type.GetProperties().ToList(); while (reader.Read()) { // 每次循环创建全新的实体实例 var instance = (T)Activator.CreateInstance(type); properties.ForEach(property => { property.SetValue(instance, reader[property.Name]); }); list.Add(instance); } return list;
可选优化点
- 可提前判断数据库字段值是否为
DBNull,避免给值类型属性赋值DBNull时报错,赋值逻辑可修改为:
var value = reader[property.Name]; property.SetValue(instance, value == DBNull.Value ? null : value);
- 若实体存在和数据库字段名不匹配的场景,可提前给属性加自定义映射特性做字段名匹配。
内容的提问来源于stack exchange,提问作者Mizanur Rahaman
相关产品推荐
相关产品推荐

