<PackageReference Include="System.Text.Json" Version="5.0.0-preview.6.20305.6" />

ObjectConverterFactory

using System.Reflection; using System.Runtime.CompilerServices; namespace System.Text.Json.Serialization.Converters { internal class ObjectConverterFactory : JsonConverterFactory { public override bool CanConvert(Type typeToConvert) { return true; } [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.LargeObjectWithParameterizedConstructorConverter`1")] [PreserveDependency(".ctor", "System.Text.Json.Serialization.Converters.SmallObjectWithParameterizedConstructorConverter`5")] public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) { ConstructorInfo deserializationConstructor = GetDeserializationConstructor(typeToConvert); ParameterInfo[] array = deserializationConstructor?.GetParameters(); Type type; if (deserializationConstructor == (ConstructorInfo)null || typeToConvert.IsAbstract || array.Length == 0) type = typeof(ObjectDefaultConverter<>).MakeGenericType(typeToConvert); else { int num = array.Length; if (num <= 4) { Type typeFromHandle = typeof(object); Type[] array2 = new Type[5] { typeToConvert, null, null, null, null }; for (int i = 0; i < 4; i++) { if (i < num) array2[i + 1] = array[i].ParameterType; else array2[i + 1] = typeFromHandle; } type = typeof(SmallObjectWithParameterizedConstructorConverter<, , , , >).MakeGenericType(array2); } else type = typeof(LargeObjectWithParameterizedConstructorConverter<>).MakeGenericType(typeToConvert); } JsonConverter jsonConverter = (JsonConverter)Activator.CreateInstance(type, BindingFlags.Instance | BindingFlags.Public, null, null, null); jsonConverter.ConstructorInfo = deserializationConstructor; return jsonConverter; } private ConstructorInfo GetDeserializationConstructor(Type type) { ConstructorInfo constructorInfo = null; ConstructorInfo constructorInfo2 = null; ConstructorInfo constructorInfo3 = null; ConstructorInfo[] constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.Public); if (constructors.Length == 1) constructorInfo3 = constructors[0]; ConstructorInfo[] array = constructors; foreach (ConstructorInfo constructorInfo4 in array) { if (constructorInfo4.GetCustomAttribute<JsonConstructorAttribute>() != null) { if (constructorInfo != (ConstructorInfo)null) ThrowHelper.ThrowInvalidOperationException_SerializationDuplicateTypeAttribute<JsonConstructorAttribute>(type); constructorInfo = constructorInfo4; } else if (constructorInfo4.GetParameters().Length == 0) { constructorInfo2 = constructorInfo4; } } ConstructorInfo left = constructorInfo; constructors = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic); ConstructorInfo[] array2 = constructors; foreach (ConstructorInfo constructorInfo5 in array2) { if (constructorInfo5.GetCustomAttribute<JsonConstructorAttribute>() != null) { if (left != (ConstructorInfo)null) ThrowHelper.ThrowInvalidOperationException_SerializationDuplicateTypeAttribute<JsonConstructorAttribute>(type); left = constructorInfo5; } } if (type.IsValueType && constructorInfo == (ConstructorInfo)null) return null; return constructorInfo ?? constructorInfo2 ?? constructorInfo3; } } }