【问题标题】:Copy the Bson to another variable without changing original?将 Bson 复制到另一个变量而不更改原始变量?
【发布时间】:2020-12-23 19:26:52
【问题描述】:

我想在变量和临时变量中保留一个 BsonDocument。哪个应该使用不同的内存并且其中一个的更改不会影响另一个。我如何做到这一点。当我更改临时变量时,原来的变量也发生了变化。使用 c# dotnet core 3.1

var obj1 = await db.GetBuildingName(); //from db bsondocuments
var obj2 = await db.HierarchyCatalogues();//from db list of bsondocuments

var tempobj = new BsonDocument();
tempobj = obj1;

BsonArray catlist = new BsonArray();
foreach (var term in obj2) { catlist.Add(term); }

tempobj.Add(new BsonElement("metadata", catlist));

当我将元数据添加到 tempobject 中时,它也反映在 obj1 中

【问题讨论】:

  • 因为tempobjobj1 指的是BsonDocument 的同一个实例。 tempobj.Add() 更新 tempobjobj1 引用的实例。您需要克隆obj1
  • 是的。 obj1 引用来自数据库。所以我不能再打电话了
  • 如果您使用的是 MongoDB,请尝试 obj1.Clone()obj1.DeepClone()
  • @phuzi 你是对的。谢谢你的回答

标签: c# .net-core bson


【解决方案1】:

与所有引用类型一样,如果您想要拥有实例的副本,则必须克隆对象。 BsonDocument 实现了两种克隆方法:Clone(浅克隆)和 DeepClone。我认为您正在寻找 DeepClone 解决方案:

using MongoDB.Bson;

var tempobj = obj1.DeepClone().ToBsonDocument();

【讨论】:

  • 深度克隆后变为bsonvalue
  • @junealex 在MongoDB.Bson 包中有一个ToBsonDocument 扩展方法,可以将任何对象转换为BsonDocument。不过好吧,我会把它添加到答案中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 2015-10-10
  • 2015-12-30
  • 2011-03-17
相关资源
最近更新 更多