You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用MongoDB时反序列化Card接口派生类出现鉴别器错误

解决MongoDB反序列化Card接口的错误

1. 修正属性名不匹配问题

观察MongoDB存储的文档,用户的卡字段是Cardul,但你的User类中对应的属性是Card,驱动无法匹配字段导致反序列化失败。给Card属性添加BsonElement特性指定对应字段名:

修改User类的Card属性:

[BsonElement("Cardul")]
public Card Card { get; set; }

2. 配置MongoDB驱动识别Card接口的派生类

MongoDB驱动默认不知道Card接口的实现类是Silver和Gold,需要显式注册这些派生类作为接口的已知实现,有两种配置方式:

方式一:接口特性标记

给Card接口添加BsonKnownTypes特性,直接指定实现类:

[BsonKnownTypes(typeof(Silver), typeof(Gold))]
interface Card
{
    // 原有接口内容
}

方式二:全局驱动映射配置

在程序初始化MongoDB连接的位置,注册接口与派生类的映射关系:

BsonClassMap.RegisterClassMap<Card>(cm =>
{
    cm.AutoMap();
    cm.AddKnownType(typeof(Silver));
    cm.AddKnownType(typeof(Gold));
});

3. 确保派生类的访问权限

你的Silver和Gold类使用默认访问修饰符(internal),如果MongoDB驱动所在程序集与这些类不在同一程序集,需将类改为public,或在程序集级别添加InternalsVisibleToAttribute让驱动能访问内部类;若在同一程序集则无需修改。

完成以上修改后,重新执行查询代码即可正常反序列化Gold类型的Card属性。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:10:52