向List添加元素时覆盖原有值,所有元素均为最后一项值的问题排查
问题原因分析
你的问题核心是引用类型的赋值逻辑错误:
- 虽然在循环里创建了
Ausencias ausenc = new Ausencias();,但紧接着ausenc = aus;把传入的aus对象的引用直接赋值给了ausenc,这相当于放弃了刚创建的新对象,转而操作原始的aus对象。 - 每次循环修改的都是同一个
aus对象的PI_StartDate和PI_EndDate,然后把这个对象的引用重复添加到列表中。最终列表里的所有元素其实都是同一个对象的引用,自然显示的都是最后一次修改后的结果。
修复方案
需要创建新的Ausencias实例,并将原始aus对象的属性值复制到新实例中,再修改日期属性:
修复后的代码
public static List<Ausencias> SeparateMonth(Ausencias aus) { List<Ausencias> ausencias = new List<Ausencias>(); try { var resultSplit = Helper.SplitFechas(aus.PI_StartDate, aus.PI_EndDate); if (resultSplit.Count > Constant.ONE) { foreach (var item in resultSplit) { // 创建新实例并复制原始对象的属性,仅修改日期 Ausencias ausenc = new Ausencias { // 复制aus的其他需要保留的属性,示例: // EmployeeId = aus.EmployeeId, // Reason = aus.Reason, PI_StartDate = item.StartDate, PI_EndDate = item.EndDate }; ausencias.Add(ausenc); } } } catch (Exception ex) { ex.Data.Clear(); } return ausencias; }
优化建议
如果Ausencias类属性较多,手动复制太繁琐,可以给类添加拷贝构造函数简化操作:
public class Ausencias { // 拷贝构造函数,复制传入对象的所有属性 public Ausencias(Ausencias other) { EmployeeId = other.EmployeeId; Reason = other.Reason; PI_StartDate = other.PI_StartDate; PI_EndDate = other.PI_EndDate; // 补充其他属性... } // 类的属性定义... }
之后循环里可以这样写:
foreach (var item in resultSplit) { Ausencias ausenc = new Ausencias(aus); ausenc.PI_StartDate = item.StartDate; ausenc.PI_EndDate = item.EndDate; ausencias.Add(ausenc); }
内容的提问来源于stack exchange,提问作者Francisco
相关产品推荐
相关产品推荐

