无法使MongoDB C#驱动程序与子类和虚拟属性一起工作?

无法使MongoDB C#驱动程序与子类和虚拟属性一起工作?,c#,mongodb,C#,Mongodb,我正在使用C#驱动程序与MongoDB合作。 问题是,我想在MongoDB中存储不同类型的对象,包括一些公共字段和不同的细节字段。不同的客户端处理数据库中的不同类型 代码如下所示: class Things { public string Name {get;set;} public string User { get; set; } public ObjectId Id { get; set; } public virtual Dictionary<st

我正在使用C#驱动程序与MongoDB合作。 问题是,我想在MongoDB中存储不同类型的对象,包括一些公共字段和不同的细节字段。不同的客户端处理数据库中的不同类型

代码如下所示:

class Things
{
    public string Name {get;set;}
    public string User { get; set; }
    public ObjectId Id { get; set; }

    public virtual Dictionary<string, object> Details { get; set; }
}

class Pc:Things
{
    public new Detail Details { get; set; }
}

class Detail
{
    public string cpu { get; set; }
    public int ram { get; set; }
    public int hdd { get; set; }
}
这与Thing相同,但将细节作为细节类型,一切正常

我做错了吗?或者这在CSharpDriver的未来版本中可能吗?

[澄清]

重读你的问题和评论,我意识到我把你的问题说错了。使用new关键字并不违法-编译器将允许您在派生类中使用同名属性返回不同的类型-发生的情况是您告诉编译器派生类的Details属性独立于其父类

当你这样做的时候,这通常是一个迹象,表明你的类层次结构没有得到很好的考虑,这就是为什么我在我最初的帖子中如此教条

在您使用多态类层次结构的情况下(尝试在MongoDb中存储具有不同
详细信息的公共类),您正在运行MongoDb驱动程序的序列化自动映射。为了实现您想要的功能,您应该使用MongoDb中描述的显式注册类的映射。引用文件的相关部分:

[来源:MongoDb文档]

您必须自己调用RegisterClassMap(即使没有参数)的一种情况是当您使用多态类层次结构时:在这种情况下,您必须注册所有已知的子类,以确保鉴别器得到注册


非常感谢,我想对于我的例子,我必须重新编写类。但是,既然我不能重新定义属性的签名以返回派生类中的详细类,为什么编译器在编译时不生成任何错误?谢谢。你说得对,我的班级结构没有经过深思熟虑。我应该从Thing类中删除细节,一切都会正常工作。如果我想处理具有任意细节的事物,我将添加名为“ThingsWithArbitraryDetails”的类,该类派生自Thing,并具有一个作为字典的details属性。但是我以前试过RegisterClassMap,但没有用。嗨-你能在反序列化失败的地方发布一个带有使用RegisterClassMap的实际代码的简短示例吗?这是一个非常好的响应,这让人更难过,在2013年的一篇文章中,有人在2016年路过,并指出,尽管这是一个非常好的回复,但遗憾的是没有提供任何示例,所以让我们对其进行否决:p作为旁白:我的评论(从2013年开始)就在您的上方,您要求原始海报提供一个他/她从未提供的失败代码的示例/奇怪的
class Pc2
{
    public string Name { get; set; }
    public string User { get; set; }
    public ObjectId Id { get; set; }
    public Detail Details { get; set; }
}