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);
         }
     }
 }
示例#3
0
        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);
        }