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

System.Text.Json中动态设置JsonPolymorphismOptions.DerivedTypes报错求助

解决System.Text.Json中JsonPolymorphismOptions.DerivedTypes只读无法赋值的问题

核心原因

JsonPolymorphismOptions.DerivedTypes是只读的ICollection<JsonDerivedType>类型,不允许直接替换整个集合,但支持通过Add或AddRange方法向现有集合中添加元素。

具体实现步骤

  1. 动态扫描程序集中的派生类型
    通过反射遍历当前程序集,筛选出所有继承自MyBaseClass的非抽象类型:
var derivedTypes = Assembly.GetExecutingAssembly()
    .GetTypes()
    .Where(t => t.IsClass && !t.IsAbstract && t.IsAssignableTo(typeof(MyBaseClass)))
    .Select(t => new JsonDerivedType(t, typeDiscriminator: t.Name)) // 可自定义类型鉴别符
    .ToList();
  1. 在自定义TypeInfoResolver中添加派生类型
    在你的NativePolymorphicTypInfoResolver中,重写GetTypeInfo方法,找到对应MyBaseClass的JsonTypeInfo,向其PolymorphismOptions.DerivedTypes中批量添加动态获取的类型:
public class NativePolymorphicTypInfoResolver : DefaultJsonTypeInfoResolver
{
    public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options)
    {
        var jsonTypeInfo = base.GetTypeInfo(type, options);
        
        if (type == typeof(MyBaseClass))
        {
            // 初始化多态配置(若未通过特性配置过)
            jsonTypeInfo.PolymorphismOptions ??= new JsonPolymorphismOptions
            {
                TypeDiscriminatorPropertyName = "$type",
                IgnoreUnrecognizedTypeDiscriminators = true
            };
            
            // 扫描并添加派生类型
            var derivedTypes = Assembly.GetExecutingAssembly()
                .GetTypes()
                .Where(t => t.IsClass && !t.IsAbstract && t.IsAssignableTo(typeof(MyBaseClass)))
                .Select(t => new JsonDerivedType(t, t.Name))
                .ToList();
            
            foreach (var derivedType in derivedTypes)
            {
                jsonTypeInfo.PolymorphismOptions.DerivedTypes.Add(derivedType);
            }
        }
        
        return jsonTypeInfo;
    }
}
  1. 启用自定义Resolver
    在JsonSerializerOptions中指定你的自定义解析器:
var serializerOptions = new JsonSerializerOptions
{
    TypeInfoResolver = new NativePolymorphicTypInfoResolver(),
    WriteIndented = true
};

注意事项

  • 扫描程序集时可根据需求调整过滤条件,比如是否包含抽象类、其他程序集的类型等。
  • 类型鉴别符(typeDiscriminator)需保证唯一性,可使用完整类名、自定义字符串或枚举值。
  • 若MyBaseClass已通过[JsonPolymorphic]特性配置过基础多态规则,直接添加派生类型即可,无需重复初始化PolymorphismOptions。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:21:04