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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:18:19