C#中如何基于List现有对象创建新对象并添加,避免修改原对象?
问题原因
你的代码里var addnewStudent= studentList[0];只是获取了集合第一个对象的引用,而非创建新对象。因为Student是引用类型,修改addnewStudent.Age本质上是修改原对象的属性,后续Add操作只是把同一个对象引用再次加入集合,所以看起来没有新增对象,实际集合里存在两个指向同一个Student实例的引用。
解决方案
因为你的Student模型有50个字段,手动逐个赋值太繁琐,推荐以下几种高效的方式:
方式1:给Student类添加复制方法
在Student类中实现一个复制自身的方法,快速创建新实例并复用原有属性:
public class Student { public string StudentName { get; set; } public string Section { get; set; } public int Age { get; set; } // 自定义复制方法 public Student Copy() { return new Student() { StudentName = this.StudentName, Section = this.Section, Age = this.Age // 其他50个字段依次赋值,一次性写完后续复用 }; } }
修改Main方法中的代码:
var addnewStudent = studentList[0].Copy(); addnewStudent.Age = 30; studentList.Add(addnewStudent);
方式2:使用反射自动复制属性
如果不想手动写50个字段的赋值,可以用反射遍历属性,自动复制到新实例:
public static T CopyObject<T>(T source) where T : new() { T target = new T(); foreach (var prop in typeof(T).GetProperties()) { if (prop.CanRead && prop.CanWrite) { prop.SetValue(target, prop.GetValue(source)); } } return target; }
调用方式:
var addnewStudent = CopyObject(studentList[0]); addnewStudent.Age = 30; studentList.Add(addnewStudent);
方式3:对象初始化器(适合少量字段修改场景)
如果只是修改个别字段,也可以直接用对象初始化器,复用原对象的属性值:
var originalStudent = studentList[0]; var addnewStudent = new Student() { StudentName = originalStudent.StudentName, Section = originalStudent.Section, Age = 30 // 只修改需要变更的字段 // 其余50个字段依次赋值,适合字段固定且不常修改的情况 }; studentList.Add(addnewStudent);
验证效果
修改后,集合里会新增一个独立的Student对象,原对象的Age还是13,新对象的Age是30,二者不会互相影响。
内容的提问来源于stack exchange,提问作者vicky
相关产品推荐
相关产品推荐

