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

Jan*_*son 5 c# mongodb mongodb-.net-driver

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

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

有人有任何想法吗?

Rob*_*tam 8

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

MyRootClass obj = new MyDerivedClass();
collection.Insert(obj);
Run Code Online (Sandbox Code Playgroud)

Insert语句也可以写成:

collection.Insert<MyRootClass>(obj);
Run Code Online (Sandbox Code Playgroud)

但是让编译器推断出类型参数会更容易.

由于obj的实际类型与标称类型不同,因此将写入"_t"鉴别器.

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

BsonClassMap.RegisterClassMap<MyDerivedClass>();
Run Code Online (Sandbox Code Playgroud)

或者序列化器不会识别鉴别器(这看起来似乎是一种限制,但序列化器只能使用它知道的类型才符合逻辑).

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

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]);
Run Code Online (Sandbox Code Playgroud)

从技术上讲,序列化不使用反射; 它是元数据驱动的.使用一次反射来构造类映射,但之后直接使用类映射而不进行反射,并且开销相当低.