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
相关产品推荐
相关产品推荐

