System.Text.Json中动态设置JsonPolymorphismOptions.DerivedTypes报错求助
解决System.Text.Json中JsonPolymorphismOptions.DerivedTypes只读无法赋值的问题
核心原因
JsonPolymorphismOptions.DerivedTypes是只读的ICollection<JsonDerivedType>类型,不允许直接替换整个集合,但支持通过Add或AddRange方法向现有集合中添加元素。
具体实现步骤
- 动态扫描程序集中的派生类型
通过反射遍历当前程序集,筛选出所有继承自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();
- 在自定义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; } }
- 启用自定义Resolver
在JsonSerializerOptions中指定你的自定义解析器:
var serializerOptions = new JsonSerializerOptions { TypeInfoResolver = new NativePolymorphicTypInfoResolver(), WriteIndented = true };
注意事项
- 扫描程序集时可根据需求调整过滤条件,比如是否包含抽象类、其他程序集的类型等。
- 类型鉴别符(
typeDiscriminator)需保证唯一性,可使用完整类名、自定义字符串或枚举值。 - 若
MyBaseClass已通过[JsonPolymorphic]特性配置过基础多态规则,直接添加派生类型即可,无需重复初始化PolymorphismOptions。
内容的提问来源于stack exchange,提问作者user23137927
相关产品推荐
相关产品推荐

