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

Blazor中更新MstService对象时List<MstService>同步变更问题求助

问题原因分析与解决办法

原因

MstService是引用类型,当你的Service对象和SList中的某一个元素指向内存中的同一个实例时,修改Service的属性就会同步改变SList中对应对象的属性——因为它们本质上是同一个对象,只是变量名不同而已。

比如你在代码的其他地方(比如编辑操作)可能做了类似Service = SList.First(s => s.Id == someId);的操作,这时候Service就和SList里的那个对象共享同一个引用,后续修改Service的属性自然会反映到SList中。

解决办法

1. 编辑时创建对象副本

当需要编辑SList中的项时,不要直接将Service指向列表中的对象,而是创建一个新的MstService实例,把原对象的属性复制过去:

// 示例:获取要编辑的项并创建副本
var targetService = SList.First(s => s.Id == editId);
Service = new MstService 
{
    Id = targetService.Id,
    Name = targetService.Name,
    IsActive = targetService.IsActive
    // 复制其他需要的属性
};

这样修改Service的属性只会影响这个新实例,不会改动SList里的原对象。

2. 给MstService实现克隆方法

如果MstService的属性较多,可以给类添加一个克隆方法,简化副本创建:

public class MstService
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsActive { get; set; }

    // 实现克隆方法
    public MstService Clone()
    {
        return new MstService
        {
            Id = this.Id,
            Name = this.Name,
            IsActive = this.IsActive
            // 复制其他属性
        };
    }
}

之后编辑时直接调用:

Service = targetService.Clone();

3. 避免意外的引用共享

检查所有给Service赋值的代码路径,确保除了初始化和重置(比如ResetForm里的新实例)之外,不要让Service直接引用SList中的元素。

内容的提问来源于stack exchange,提问作者user3820036

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:40:30