<PackageReference Include="System.Text.Json" Version="9.0.1" />

SmallObjectWithParameterizedConstructorConverter<T, TArg0, TArg1, TArg2, TArg3>

using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; using System.Text.Json.Serialization.Metadata; namespace System.Text.Json.Serialization.Converters { internal sealed class SmallObjectWithParameterizedConstructorConverter<T, TArg0, TArg1, TArg2, TArg3> : ObjectWithParameterizedConstructorConverter<T> { protected override object CreateObject(ref ReadStackFrame frame) { JsonTypeInfo.ParameterizedConstructorDelegate<T, TArg0, TArg1, TArg2, TArg3> obj = (JsonTypeInfo.ParameterizedConstructorDelegate<T, TArg0, TArg1, TArg2, TArg3>)frame.JsonTypeInfo.CreateObjectWithArgs; Arguments<TArg0, TArg1, TArg2, TArg3> arguments = (Arguments<TArg0, TArg1, TArg2, TArg3>)frame.CtorArgumentState.Arguments; return obj(arguments.Arg0, arguments.Arg1, arguments.Arg2, arguments.Arg3); } protected override bool ReadAndCacheConstructorArgument([System.Runtime.CompilerServices.ScopedRef] ref ReadStack state, ref Utf8JsonReader reader, JsonParameterInfo jsonParameterInfo) { Arguments<TArg0, TArg1, TArg2, TArg3> arguments = (Arguments<TArg0, TArg1, TArg2, TArg3>)state.Current.CtorArgumentState.Arguments; switch (jsonParameterInfo.Position) { case 0: return TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg0); case 1: return TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg1); case 2: return TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg2); case 3: return TryRead(ref state, ref reader, jsonParameterInfo, out arguments.Arg3); default: throw new InvalidOperationException(); } } private static bool TryRead<TArg>([System.Runtime.CompilerServices.ScopedRef] ref ReadStack state, ref Utf8JsonReader reader, JsonParameterInfo jsonParameterInfo, out TArg arg) { JsonParameterInfo<TArg> jsonParameterInfo2 = (JsonParameterInfo<TArg>)jsonParameterInfo; TArg value; bool isPopulatedValue; bool num = jsonParameterInfo2.EffectiveConverter.TryRead(ref reader, jsonParameterInfo2.ParameterType, jsonParameterInfo2.Options, ref state, out value, out isPopulatedValue); if (num && value == null) { if (jsonParameterInfo2.IgnoreNullTokensOnRead) value = jsonParameterInfo2.EffectiveDefaultValue; else if (!jsonParameterInfo2.IsNullable && jsonParameterInfo2.Options.RespectNullableAnnotations) { ThrowHelper.ThrowJsonException_ConstructorParameterDisallowNull(jsonParameterInfo2.Name, state.Current.JsonTypeInfo.Type); } } arg = value; return num; } protected override void InitializeConstructorArgumentCaches(ref ReadStack state, JsonSerializerOptions options) { JsonTypeInfo jsonTypeInfo = state.Current.JsonTypeInfo; Arguments<TArg0, TArg1, TArg2, TArg3> arguments = new Arguments<TArg0, TArg1, TArg2, TArg3>(); ReadOnlySpan<JsonParameterInfo> parameterCache = jsonTypeInfo.ParameterCache; foreach (JsonParameterInfo jsonParameterInfo in parameterCache) { switch (jsonParameterInfo.Position) { case 0: arguments.Arg0 = ((JsonParameterInfo<TArg0>)jsonParameterInfo).EffectiveDefaultValue; break; case 1: arguments.Arg1 = ((JsonParameterInfo<TArg1>)jsonParameterInfo).EffectiveDefaultValue; break; case 2: arguments.Arg2 = ((JsonParameterInfo<TArg2>)jsonParameterInfo).EffectiveDefaultValue; break; case 3: arguments.Arg3 = ((JsonParameterInfo<TArg3>)jsonParameterInfo).EffectiveDefaultValue; break; } } state.Current.CtorArgumentState.Arguments = arguments; } [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCode("JSON serialization and deserialization might require types that cannot be statically analyzed. Use the overload that takes a JsonTypeInfo or JsonSerializerContext, or make sure all of the required types are preserved.")] [System.Diagnostics.CodeAnalysis.RequiresDynamicCode("JSON serialization and deserialization might require types that cannot be statically analyzed and might need runtime code generation. Use System.Text.Json source generation for native AOT applications.")] internal override void ConfigureJsonTypeInfoUsingReflection(JsonTypeInfo jsonTypeInfo, JsonSerializerOptions options) { jsonTypeInfo.CreateObjectWithArgs = DefaultJsonTypeInfoResolver.MemberAccessor.CreateParameterizedConstructor<T, TArg0, TArg1, TArg2, TArg3>(base.ConstructorInfo); } } }