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

.NET 7中使用System.Text.Json实现所有子类的多态序列化

.NET 7 批量配置多态序列化的简洁方案

当派生类数量较多时,逐个添加[JsonDerivedType]确实低效,以下两种方案可以批量完成多态序列化配置:

1. 反射扫描程序集 + 自定义JsonSerializerOptions

通过反射自动扫描指定程序集中所有继承自目标基类的类型,手动添加到序列化选项的多态配置中:

using System.Reflection;
using System.Text.Json.Serialization;

public static class JsonOptionsExtensions
{
    public static void AddPolymorphicTypesForBase<TBase>(this JsonSerializerOptions options, Assembly assembly)
    {
        // 筛选出程序集中非抽象、非基类本身的派生类型
        var derivedTypes = assembly.GetTypes()
            .Where(t => t.IsClass && !t.IsAbstract && t.IsAssignableTo(typeof(TBase)) && t != typeof(TBase));

        var polymorphismOptions = options.GetPolymorphismOptions(typeof(TBase)) 
                                 ?? new JsonPolymorphismOptions();

        foreach (var type in derivedTypes)
        {
            // 用类型名称作为序列化标识,也可自定义为全限定名避免冲突
            polymorphismOptions.DerivedTypes.Add(new JsonDerivedType(type, type.Name));
        }

        options.SetPolymorphismOptions(typeof(TBase), polymorphismOptions);
    }
}

// 使用示例
var options = new JsonSerializerOptions();
// 扫描当前程序集内的所有派生类
options.AddPolymorphicTypesForBase<BaseClass>(Assembly.GetExecutingAssembly());

// 序列化测试
BaseClass instance = new ChildClass { FirstName = "John", LastName = "Doe" };
string json = JsonSerializer.Serialize(instance, options);
// 反序列化测试
var deserialized = JsonSerializer.Deserialize<BaseClass>(json, options);

2. ASP.NET Core 全局配置

如果是ASP.NET Core项目,可在Program.cs中全局配置该选项,所有API接口的序列化都会自动生效:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        // 扫描包含基类的程序集
        var targetAssembly = typeof(BaseClass).Assembly;
        options.JsonSerializerOptions.AddPolymorphicTypesForBase<BaseClass>(targetAssembly);
    });

var app = builder.Build();
// ... 后续中间件配置

注意事项

  • 若派生类分布在多个程序集,可多次调用扫描方法覆盖所有目标程序集。
  • 类型标识符可按需自定义,比如用类型全限定名避免不同命名空间下同名类型的冲突。
  • 反射过滤时记得排除抽象类,避免添加无效的多态配置项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:23:17