c# - 使用 C# 从 MongoDB 获取继承的实例

标签 c# mongodb mongodb-.net-driver

我正在使用官方的 MongoDb C# 驱动程序。

我的场景:我将对象存储到 MongoDb 中。所有对象都是从同一根类继承的类的实例。 在设计时,我不知道所有可以存储的类(即它们可以插入) - 所以我需要一些方法来告诉序列化程序/驱动程序如何将类映射到文档(文档中的描述符)。

有人有什么想法吗?

最佳答案

只要对象的实际类型与标称类型不同,官方 C# 驱动程序就会写入一个“_t”鉴别器值。比如:

MyRootClass obj = new MyDerivedClass();
collection.Insert(obj);

也可以编写插入语句:

collection.Insert<MyRootClass>(obj);

但让编译器推断类型参数更容易。

由于 obj 的实际类型与名义类型不同,因此将写入“_t”鉴别器。

读回对象时,您必须确保 MyDerivedClass 已正确注册:

BsonClassMap.RegisterClassMap<MyDerivedClass>();

否则序列化器将无法识别鉴别器(这似乎是一种限制,但序列化器只能使用它知道的类型是合乎逻辑的)。

您提到您在编译时不知道类,因此必须动态调用上述注册代码。一种方法是:

Type myDerivedClass; // your plugged-in class
var registerClassMapDefinition = typeof(BsonClassMap).GetMethod("RegisterClassMap", new Type[0]);
var registerClassMapInfo = registerClassMapDefinition.MakeGenericMethod(myDerivedClass);
registerClassMapInfo.Invoke(null, new object[0]);

从技术上讲,序列化不使用反射;它是元数据驱动的。使用一次反射构造class map,之后直接使用class map,不用反射,开销比较低。

关于c# - 使用 C# 从 MongoDB 获取继承的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6265396/

相关文章:

node.js - 我如何使用 Node.js 和 Mongoose 计算总正价、总负价和总和

c# - 用于构造 OData 查询选项的强类型 Linq

node.js - Mongoose 在引用的文档属性中查找

mongodb - 如何在 MongoDB 中索引两个数组?

c# - 如何使用 C# MongoDb 驱动程序更新深度嵌套数组中的字段 "type-safe"?

c# - 为什么 AsQueryable<T> 不暗示 _t 鉴别器上的过滤器

c# - MongoDB - 更新字段或添加字段(如果 BsonDocument C# 上不存在)

C# listview 子项不显示

c# - 获取 Windows Phone 7.1 设备 ID

c# - 使用指定的字体名称在 Excel 中查找和替换文本