11using System . Collections . Generic ;
22using System . Reflection ;
3- using System . Runtime . CompilerServices ;
43using System . Runtime . Serialization ;
54using System . Globalization ;
65
@@ -34,6 +33,7 @@ public EnumInfo(string name, TEnum enumValue, ulong rawValue)
3433#endif
3534
3635 private readonly bool _AllowIntegerValues ;
36+ private readonly ulong ? _DeserializationFailureFallbackValueRaw ;
3737 private readonly TEnum ? _DeserializationFailureFallbackValue ;
3838 private readonly Type _EnumType ;
3939 private readonly TypeCode _EnumTypeCode ;
@@ -80,7 +80,10 @@ public JsonStringEnumMemberConverterHelper(JsonStringEnumMemberConverterOptions?
8080 throw new NotSupportedException ( ) ;
8181
8282 if ( deserializationFailureFallbackValue . HasValue && rawValue == deserializationFailureFallbackValue )
83+ {
84+ _DeserializationFailureFallbackValueRaw = deserializationFailureFallbackValue ;
8385 _DeserializationFailureFallbackValue = typedValue ;
86+ }
8487
8588 _RawToTransformed [ typedValue ] = new EnumInfo ( transformedName , typedValue , rawValue ) ;
8689 _TransformedToRaw [ transformedName ] = new EnumInfo ( name , typedValue , rawValue ) ;
@@ -133,7 +136,12 @@ public TEnum Read(ref Utf8JsonReader reader)
133136 }
134137
135138 if ( ! matched )
136- return ReturnDefaultValueOrThrowJsonException ( flagValue ) ;
139+ {
140+ if ( _DeserializationFailureFallbackValueRaw . HasValue )
141+ calculatedValue |= _DeserializationFailureFallbackValueRaw . Value ;
142+ else
143+ throw ThrowHelper . GenerateJsonException_DeserializeUnableToConvertValue ( _EnumType , flagValue ) ;
144+ }
137145 }
138146 }
139147
@@ -154,7 +162,7 @@ public TEnum Read(ref Utf8JsonReader reader)
154162 }
155163 }
156164
157- return ReturnDefaultValueOrThrowJsonException ( enumString ) ;
165+ return _DeserializationFailureFallbackValue ?? throw ThrowHelper . GenerateJsonException_DeserializeUnableToConvertValue ( _EnumType , enumString ) ;
158166 }
159167
160168 if ( token != JsonTokenType . Number || ! _AllowIntegerValues )
@@ -298,9 +306,5 @@ public void Write(Utf8JsonWriter writer, TEnum value)
298306 throw new JsonException ( ) ; // GetEnumValue should have already thrown.
299307 }
300308 }
301-
302- [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
303- private TEnum ReturnDefaultValueOrThrowJsonException ( string propertyValue )
304- => _DeserializationFailureFallbackValue ?? throw ThrowHelper . GenerateJsonException_DeserializeUnableToConvertValue ( _EnumType , propertyValue ) ;
305309 }
306310}
0 commit comments