You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用反射动态处理列表并将返回数据转为列表,解决读库数据重复问题

反射生成实体列表重复值问题修复方案

问题原因

你定义的实体实例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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 21:06:03