复制JSON对应类实例后修改新项致原项变更问题排查
问题根源:引用类型的浅拷贝导致原对象被修改
你遇到的问题是C#中引用类型的特性导致的:当你把oDORitem添加到集合时,并没有创建新的对象实例,只是把同一个对象的引用重复添加了进去。所以后续修改这个引用指向的对象时,原集合里的那个元素也会跟着改变——因为它们本质上是同一个对象。
具体分析你的代码
看这段关键代码:
OriginDestinationOptionRef oDORitem = originDestinationOptionRef.Last(); originDestinationOptionRef.Add(oDORitem); // 这里添加的是原对象的引用,不是新对象
此时originDestinationOptionRef集合里有三个元素,但后两个元素指向的是同一个OriginDestinationOptionRef实例。所以当你修改oDORitemModify(也就是这个共享实例)的uri、id和index时,原集合里的第二个元素自然也会被修改,就出现了你看到的结果。
修复方案:创建新的对象实例
你需要复制原对象的属性值到一个新的OriginDestinationOptionRef实例中,再把这个新实例添加到集合里,之后修改新实例的属性就不会影响原对象了。修改后的代码如下:
private void addFlightButton_Click(object sender, RoutedEventArgs e) { var originDestinationGroup = jsonObject.search.originDestinationGroup; OriginDestinationGroup oDGitem = originDestinationGroup.Last(); var departureDateGroup = oDGitem.departureDateGroup; DepartureDateGroup dDGitem = departureDateGroup.Last(); var originDestinationOptionRef = dDGitem.originDestinationOptionRef; OriginDestinationOptionRef oDORitem = originDestinationOptionRef.Last(); // 关键:创建新的对象实例,复制原对象的属性 OriginDestinationOptionRef newODORitem = new OriginDestinationOptionRef { uri = oDORitem.uri, id = oDORitem.id, index = oDORitem.index }; // 添加新实例到集合 originDestinationOptionRef.Add(newODORitem); // 基于原对象的值计算新的属性值 char uriNumber = oDORitem.uri[oDORitem.uri.Length - 1]; string uriString = oDORitem.uri.TrimEnd(uriNumber); int idNumber = Convert.ToInt32(oDORitem.id); int indexNumber = oDORitem.index; uriNumber++; idNumber++; indexNumber++; // 修改新实例的属性(不会影响原对象) newODORitem.uri = uriString + uriNumber.ToString(); newODORitem.id = idNumber.ToString(); newODORitem.index = indexNumber; }
为什么这样能解决问题?
- 新创建的
newODORitem是一个独立的对象实例,和原oDORitem没有引用关系 - 添加到集合后,集合里的元素都是各自独立的对象
- 修改
newODORitem的属性只会影响这个新对象,原对象的属性保持不变
这样修改后,你就能得到预期的JSON结果:原有的option/2元素保留,新添加的元素是option/3,不会出现原元素被修改的情况。
内容的提问来源于stack exchange,提问作者Adicili
相关产品推荐
相关产品推荐

