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

C#中List<ButtonTemplateModel>元素全部被最后添加项覆盖问题求助

问题原因

所有ButtonTemplateModel的ActionVM属性都指向同一个引用对象:EpisodeBtnConfig.ActionButtonVM。
ActionVM属于引用类型,赋值时只会传递内存地址而不会复制整个对象的内容。你在循环中修改任意cmdBtnTemplateVM.ActionVM的属性值,本质都是修改同一个内存地址下的对象数据,所以最后一次修改的结果会覆盖所有之前创建的ButtonTemplateModel实例中ActionVM的属性取值。

解决方案

每次循环创建ButtonTemplateModel实例时,手动新建一个ActionVM实例,将原EpisodeBtnConfig.ActionButtonVM的属性值逐一拷贝到新实例中,避免所有对象共享同一个ActionVM实例,示例修改如下:

foreach (KeyValuePair<string, string> entry in stageType)
{
    ButtonTemplateModel  cmdBtnTemplateVM = new()
    {
        // 新建ActionVM实例,拷贝原有属性,不直接引用全局的ActionButtonVM
        ActionVM = new YourActionVMClassName // 替换成你ActionVM对应的实际类名
        {
            ControllerName = EpisodeBtnConfig.ActionButtonVM.ControllerName,
            ActionName = EpisodeBtnConfig.ActionButtonVM.ActionName,
            HostingPage = EpisodeBtnConfig.ActionButtonVM.HostingPage,
            EpisodeID = EpisodeBtnConfig.ActionButtonVM.EpisodeID,
            PeopleListID = EpisodeBtnConfig.ActionButtonVM.PeopleListID
            // 补充ActionVM类所有需要保留的属性赋值
        },
        Title = entry.Value,
        Stage = entry.Key,
        TextNode = entry.Key,
        ActionBtnCssClass = actionBtnClass[entry.Key],
        ShowThisButton = true,
        DisableThisButton = false
    };

    // 后续原有switch逻辑和其他判断逻辑保持不变
}

注意:如果ActionVM类内部还有嵌套的引用类型属性,需要对嵌套的引用类型同样做逐层拷贝,避免嵌套属性仍出现共享实例被覆盖的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:36:03