src/01_Utils/Utils/Json/JsonSerializerOptionsExtensions.cs

(完整代码) 2KB

using System;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Text.Json;
using System.Text.Json.Serialization;
using Mkh.Utils.Helpers;
using Mkh.Utils.Json.Converters;

namespace Mkh.Utils.Json
{
    public static class JsonSerializerOptionsExtensions
    {
        /// <summary>
        /// 添加多态嵌套序列化解决方案
        /// </summary>
        /// <param name="options"></param>
        /// <param name="assembly"></param>
        /// <returns></returns>
        public static JsonSerializerOptions AddPolymorphism(this JsonSerializerOptions options)
        {
            if (options != null)
            {
                var assemblies = new AssemblyHelper().Load();
                foreach (var assembly in assemblies)
                {
                    try
                    {
                        var typeSignature = "PolymorphismConverterLib";

                        var types = assembly.GetTypes().Where(m => m.GetCustomAttributes().Any(n => n.GetType() == typeof(JsonPolymorphismAttribute)));
                        foreach (var t in types)
                        {
                            var assemblyName = new AssemblyName(typeSignature);
                            var dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
                            var dynamicModule = dynamicAssembly.DefineDynamicModule(typeSignature);
                            var dynamicType = dynamicModule.DefineType(t.Name + "DynamicJsonConverter",
                                TypeAttributes.Public |
                                TypeAttributes.Class,
                                null);

                            dynamicType.SetParent(typeof(PolymorphismConverter<>).MakeGenericType(t));

                            var generatedType = dynamicType.CreateType();

                            options.Converters.Add((JsonConverter)Activator.CreateInstance(generatedType));
                        }
                    }
                    catch
                    {
                        //此处防止第三方库抛出一场导致系统无法启动,所以需要捕获异常来处理一下
                    }
                }
            }

            return options;
        }
    }
}

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。