private static Type GetTypeFromMapping(NullableDictionary <object, Type> typeMapping, JToken discriminatorToken, JsonSerializer serializer) { if (discriminatorToken.Type == JTokenType.Null) { typeMapping.TryGetValue(null, out Type targetType); return(targetType); } var key = typeMapping.NotNullKeys().FirstOrDefault(); if (key != null) { var targetLookupValueType = key.GetType(); var lookupValue = discriminatorToken.ToObject(targetLookupValueType, serializer); if (typeMapping.TryGetValue(lookupValue, out Type targetType)) { return(targetType); } } return(null); }
internal JsonSubtypesConverter(Type baseType, string discriminatorProperty, NullableDictionary <object, Type> subTypeMapping, bool serializeDiscriminatorProperty, bool addDiscriminatorFirst, Type fallbackType) : base(discriminatorProperty) { _serializeDiscriminatorProperty = serializeDiscriminatorProperty; _baseType = baseType; _subTypeMapping = subTypeMapping; _addDiscriminatorFirst = addDiscriminatorFirst; _fallbackType = fallbackType; foreach (var type in subTypeMapping.Entries()) { if (_supportedTypes.ContainsKey(type.Value)) { if (_serializeDiscriminatorProperty) { throw new InvalidOperationException( "Multiple discriminators on single type are not supported " + "when discriminator serialization is enabled"); } } else { _supportedTypes.Add(type.Value, type.Key); } } }
internal virtual NullableDictionary <object, Type> GetSubTypeMapping(Type type) { var dictionary = new NullableDictionary <object, Type>(); GetAttributes <KnownSubTypeAttribute>(ToTypeInfo(type)) .ToList() .ForEach(x => dictionary.Add(x.AssociatedValue, x.SubType)); return(dictionary); }