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

如何使用MongoDB C# Driver反序列化类中的readonly私有字段

问题根因

MongoDB C# 驱动默认会遵循C#语言的readonly修饰符约束,反序列化过程中不会给readonly字段写入值,所以即使配置了字段映射,查询得到的Company实例里对应字段仍然是初始化的空集合。移除readonly后驱动允许正常赋值,所以反序列化恢复正常。

解决方案

不需要修改Company类的定义,也不用移除readonly修饰符,只需要调整Bson类映射的配置,显式告知驱动允许对这两个readonly字段执行反序列化写入即可:

public static class Mapping
{
    public static IServiceCollection AddMappings(this IServiceCollection services)
    {
        BsonClassMap.RegisterClassMap<Company>(classMap =>
        {
            classMap.AutoMap();
            classMap.MapField("_executedImportInfo")
                .SetElementName(nameof(Company.ExecutedImportInfo))
                // 覆盖字段只读状态,允许驱动通过反射写入值
                .SetIsReadOnly(false)
                // 直接往已初始化的List中填充元素,不需要替换字段实例
                .SetDeserializationMethod(MemberDeserializationMethod.Populate);
            classMap.MapField("_stockPrices")
                .SetElementName(nameof(Company.StockPrices))
                .SetIsReadOnly(false)
                .SetDeserializationMethod(MemberDeserializationMethod.Populate);
        });

        return services;
    }
}

如果你的驱动版本较新,只加SetIsReadOnly(false)也可以正常反序列化,SetDeserializationMethod是适配字段已提前初始化集合的场景,避免反序列化时生成新的集合实例替换原有字段值,稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:54:08