/// <summary>
        /// Initializes a new instance of the <see cref="JsonArrayContract"/> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        public JsonArrayContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Array;
            IsArray      = CreatedType.IsArray;

            bool canDeserialize;

            Type tempCollectionType;

            if (IsArray)
            {
                CollectionItemType               = ReflectionUtils.GetCollectionItemType(UnderlyingType);
                IsReadOnlyOrFixedSize            = true;
                _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);

                canDeserialize          = true;
                IsMultidimensionalArray = (IsArray && UnderlyingType.GetArrayRank() > 1);
            }
            else if (typeof(IList).IsAssignableFrom(underlyingType))
            {
                if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out _genericCollectionDefinitionType))
                {
                    CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0];
                }
                else
                {
                    CollectionItemType = ReflectionUtils.GetCollectionItemType(underlyingType);
                }

                if (underlyingType == typeof(IList))
                {
                    CreatedType = typeof(List <object>);
                }

                if (CollectionItemType != null)
                {
                    _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, CollectionItemType);
                }

                IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyCollection <>));
                canDeserialize        = true;
            }
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out _genericCollectionDefinitionType))
            {
                CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ICollection <>)) ||
                    ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IList <>)))
                {
                    CreatedType = typeof(List <>).MakeGenericType(CollectionItemType);
                }

#if HAVE_ISET
                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ISet <>)))
                {
                    CreatedType = typeof(HashSet <>).MakeGenericType(CollectionItemType);
                }
#endif

                _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, CollectionItemType);
                canDeserialize            = true;
                ShouldCreateWrapper       = true;
            }
#if HAVE_READ_ONLY_COLLECTIONS
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>), out tempCollectionType))
            {
                CollectionItemType = tempCollectionType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>)) ||
                    ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyList <>)))
                {
                    CreatedType = typeof(ReadOnlyCollection <>).MakeGenericType(CollectionItemType);
                }

                _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);
                _parameterizedConstructor        = CollectionUtils.ResolveEnumerableCollectionConstructor(CreatedType, CollectionItemType);

#if HAVE_FSHARP_TYPES
                StoreFSharpListCreatorIfNecessary(underlyingType);
#endif

                IsReadOnlyOrFixedSize = true;
                canDeserialize        = HasParameterizedCreatorInternal;
            }
#endif
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IEnumerable <>), out tempCollectionType))
            {
                CollectionItemType = tempCollectionType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IEnumerable <>)))
                {
                    CreatedType = typeof(List <>).MakeGenericType(CollectionItemType);
                }

                _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, CollectionItemType);

#if HAVE_FSHARP_TYPES
                StoreFSharpListCreatorIfNecessary(underlyingType);
#endif

                if (underlyingType.IsGenericType() && underlyingType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                {
                    _genericCollectionDefinitionType = tempCollectionType;

                    IsReadOnlyOrFixedSize = false;
                    ShouldCreateWrapper   = false;
                    canDeserialize        = true;
                }
                else
                {
                    _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);

                    IsReadOnlyOrFixedSize = true;
                    ShouldCreateWrapper   = true;
                    canDeserialize        = HasParameterizedCreatorInternal;
                }
            }
            else
            {
                // types that implement IEnumerable and nothing else
                canDeserialize      = false;
                ShouldCreateWrapper = true;
            }

            CanDeserialize = canDeserialize;

#if (NET20 || NET35)
            if (CollectionItemType != null && ReflectionUtils.IsNullableType(CollectionItemType))
            {
                // bug in .NET 2.0 & 3.5 that List<Nullable<T>> throws an error when adding null via IList.Add(object)
                // wrapper will handle calling Add(T) instead
                if (ReflectionUtils.InheritsGenericDefinition(CreatedType, typeof(List <>), out tempCollectionType) ||
                    (IsArray && !IsMultidimensionalArray))
                {
                    ShouldCreateWrapper = true;
                }
            }
#endif

#if HAVE_IMMUTABLE_COLLECTIONS
            Type immutableCreatedType;
            ObjectConstructor <object> immutableParameterizedCreator;
            if (ImmutableCollectionsUtils.TryBuildImmutableForArrayContract(underlyingType, CollectionItemType, out immutableCreatedType, out immutableParameterizedCreator))
            {
                CreatedType           = immutableCreatedType;
                _parameterizedCreator = immutableParameterizedCreator;
                IsReadOnlyOrFixedSize = true;
                CanDeserialize        = true;
            }
#endif
        }
Exemplo n.º 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonDictionaryContract"/> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        public JsonDictionaryContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Dictionary;

            Type keyType;
            Type valueType;

            if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IDictionary <,>)))
                {
                    CreatedType = typeof(Dictionary <,>).MakeGenericType(keyType, valueType);
                }

#if !(NET40 || NET35 || NET20 || PORTABLE40)
                IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyDictionary <,>));
#endif
            }
#if !(NET40 || NET35 || NET20 || PORTABLE40)
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IReadOnlyDictionary <,>)))
                {
                    CreatedType = typeof(ReadOnlyDictionary <,>).MakeGenericType(keyType, valueType);
                }

                IsReadOnlyOrFixedSize = true;
            }
#endif
            else
            {
                ReflectionUtils.GetDictionaryKeyValueTypes(UnderlyingType, out keyType, out valueType);

                if (UnderlyingType == typeof(IDictionary))
                {
                    CreatedType = typeof(Dictionary <object, object>);
                }
            }

            if (keyType != null && valueType != null)
            {
                _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(CreatedType, typeof(KeyValuePair <,>).MakeGenericType(keyType, valueType));

#if !(NET35 || NET20)
                if (!HasParameterizedCreatorInternal && underlyingType.Name == FSharpUtils.FSharpMapTypeName)
                {
                    FSharpUtils.EnsureInitialized(underlyingType.Assembly());
                    _parameterizedCreator = FSharpUtils.CreateMap(keyType, valueType);
                }
#endif
            }

            ShouldCreateWrapper = !typeof(IDictionary).IsAssignableFrom(CreatedType);

            DictionaryKeyType   = keyType;
            DictionaryValueType = valueType;

#if (NET20 || NET35)
            if (DictionaryValueType != null && ReflectionUtils.IsNullableType(DictionaryValueType))
            {
                Type tempDictioanryType;

                // bug in .NET 2.0 & 3.5 that Dictionary<TKey, Nullable<TValue>> throws an error when adding null via IDictionary[key] = object
                // wrapper will handle calling Add(T) instead
                if (ReflectionUtils.InheritsGenericDefinition(CreatedType, typeof(Dictionary <,>), out tempDictioanryType))
                {
                    ShouldCreateWrapper = true;
                }
            }
#endif

#if !(NET20 || NET35 || NET40)
            Type immutableCreatedType;
            ObjectConstructor <object> immutableParameterizedCreator;
            if (ImmutableCollectionsUtils.TryBuildImmutableForDictionaryContract(underlyingType, DictionaryKeyType, DictionaryValueType, out immutableCreatedType, out immutableParameterizedCreator))
            {
                CreatedType           = immutableCreatedType;
                _parameterizedCreator = immutableParameterizedCreator;
                IsReadOnlyOrFixedSize = true;
            }
#endif
        }
Exemplo n.º 3
0
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonArrayContract"/> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        public JsonArrayContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Array;
            IsArray      = CreatedType.IsArray;

            bool canDeserialize;

            Type tempCollectionType;

            if (IsArray)
            {
                CollectionItemType               = ReflectionUtils.GetCollectionItemType(UnderlyingType);
                IsReadOnlyOrFixedSize            = true;
                _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);

                canDeserialize          = true;
                IsMultidimensionalArray = (IsArray && UnderlyingType.GetArrayRank() > 1);
            }
            else if (typeof(IList).IsAssignableFrom(underlyingType))
            {
                if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out _genericCollectionDefinitionType))
                {
                    CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0];
                }
                else
                {
                    CollectionItemType = ReflectionUtils.GetCollectionItemType(underlyingType);
                }

                if (underlyingType == typeof(IList))
                {
                    CreatedType = typeof(List <object>);
                }

                if (CollectionItemType != null)
                {
                    ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(underlyingType, CollectionItemType);
                }

                IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyCollection <>));
                canDeserialize        = true;
            }
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out _genericCollectionDefinitionType))
            {
                CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ICollection <>)) ||
                    ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IList <>)))
                {
                    CreatedType = typeof(List <>).MakeGenericType(CollectionItemType);
                }

#if !(NET20 || NET35 || PORTABLE40)
                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ISet <>)))
                {
                    CreatedType = typeof(HashSet <>).MakeGenericType(CollectionItemType);
                }
#endif

                ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(underlyingType, CollectionItemType);
                canDeserialize          = true;
                ShouldCreateWrapper     = true;
            }
#if !(NET40 || NET35 || NET20 || PORTABLE40)
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>), out tempCollectionType))
            {
                CollectionItemType = underlyingType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>)) ||
                    ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyList <>)))
                {
                    CreatedType = typeof(ReadOnlyCollection <>).MakeGenericType(CollectionItemType);
                }

                _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);
                ParametrizedConstructor          = CollectionUtils.ResolveEnumableCollectionConstructor(CreatedType, CollectionItemType);
                IsReadOnlyOrFixedSize            = true;
                canDeserialize = (ParametrizedConstructor != null);
            }
#endif
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IEnumerable <>), out tempCollectionType))
            {
                CollectionItemType = tempCollectionType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IEnumerable <>)))
                {
                    CreatedType = typeof(List <>).MakeGenericType(CollectionItemType);
                }

                ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(underlyingType, CollectionItemType);

#if !(NET35 || NET20 || NETFX_CORE)
                if (ParametrizedConstructor == null && underlyingType.Name == FSharpUtils.FSharpListTypeName)
                {
                    FSharpUtils.EnsureInitialized(underlyingType.Assembly());
                    ParametrizedConstructor = FSharpUtils.CreateSeq(CollectionItemType);
                }
#endif

                if (underlyingType.IsGenericType() && underlyingType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                {
                    _genericCollectionDefinitionType = tempCollectionType;

                    IsReadOnlyOrFixedSize = false;
                    ShouldCreateWrapper   = false;
                    canDeserialize        = true;
                }
                else
                {
                    _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);

                    IsReadOnlyOrFixedSize = true;
                    ShouldCreateWrapper   = true;
                    canDeserialize        = (ParametrizedConstructor != null);
                }
            }
            else
            {
                // types that implement IEnumerable and nothing else
                canDeserialize      = false;
                ShouldCreateWrapper = true;
            }

            CanDeserialize = canDeserialize;

            if (CollectionItemType != null)
            {
                _isCollectionItemTypeNullableType = ReflectionUtils.IsNullableType(CollectionItemType);
            }

#if (NET20 || NET35)
            // bug in .NET 2.0 & 3.5 that List<Nullable<T>> throws an error when adding null via IList.Add(object)
            // wrapper will handle calling Add(T) instead
            if (_isCollectionItemTypeNullableType &&
                (ReflectionUtils.InheritsGenericDefinition(CreatedType, typeof(List <>), out tempCollectionType) ||
                 (IsArray && !IsMultidimensionalArray)))
            {
                ShouldCreateWrapper = true;
            }
#endif

#if !(NET20 || NET35 || NET40 || PORTABLE40)
            Type       immutableCreatedType;
            MethodBase immutableParameterizedCreator;
            if (ImmutableCollectionsUtils.TryBuildImmutableForArrayContract(underlyingType, CollectionItemType, out immutableCreatedType, out immutableParameterizedCreator))
            {
                CreatedType             = immutableCreatedType;
                ParametrizedConstructor = immutableParameterizedCreator;
                IsReadOnlyOrFixedSize   = true;
                CanDeserialize          = true;
            }
#endif
        }
Exemplo n.º 4
0
        public JsonDictionaryContract(Type underlyingType) : base(underlyingType)
        {
            this.ContractType = JsonContractType.Dictionary;
            Type type;
            Type type2;

            if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IDictionary <, >), out this._genericCollectionDefinitionType))
            {
                type  = this._genericCollectionDefinitionType.GetGenericArguments()[0];
                type2 = this._genericCollectionDefinitionType.GetGenericArguments()[1];
                if (ReflectionUtils.IsGenericDefinition(base.UnderlyingType, typeof(IDictionary <, >)))
                {
                    base.CreatedType = typeof(Dictionary <, >).MakeGenericType(new Type[]
                    {
                        type,
                        type2
                    });
                }
                else if (underlyingType.IsGenericType() && underlyingType.GetGenericTypeDefinition().FullName == "System.Collections.Concurrent.ConcurrentDictionary`2")
                {
                    this.ShouldCreateWrapper = 1;
                }
            }
            else
            {
                ReflectionUtils.GetDictionaryKeyValueTypes(base.UnderlyingType, out type, out type2);
                if (base.UnderlyingType == typeof(IDictionary))
                {
                    base.CreatedType = typeof(Dictionary <object, object>);
                }
            }
            if (type != null && type2 != null)
            {
                this._parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(base.CreatedType, typeof(KeyValuePair <, >).MakeGenericType(new Type[]
                {
                    type,
                    type2
                }), typeof(IDictionary <, >).MakeGenericType(new Type[]
                {
                    type,
                    type2
                }));
                if (!this.HasParameterizedCreatorInternal && underlyingType.Name == "FSharpMap`2")
                {
                    FSharpUtils.EnsureInitialized(underlyingType.Assembly());
                    this._parameterizedCreator = FSharpUtils.Instance.CreateMap(type, type2);
                }
            }
            if (!typeof(IDictionary).IsAssignableFrom(base.CreatedType))
            {
                this.ShouldCreateWrapper = 1;
            }
            this.DictionaryKeyType   = type;
            this.DictionaryValueType = type2;
            Type createdType;
            ObjectConstructor <object> parameterizedCreator;

            if (this.DictionaryKeyType != null && this.DictionaryValueType != null && ImmutableCollectionsUtils.TryBuildImmutableForDictionaryContract(underlyingType, this.DictionaryKeyType, this.DictionaryValueType, out createdType, out parameterizedCreator))
            {
                base.CreatedType           = createdType;
                this._parameterizedCreator = parameterizedCreator;
                this.IsReadOnlyOrFixedSize = true;
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonDictionaryContract"/> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        public JsonDictionaryContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Dictionary;

            Type keyType;
            Type valueType;

            if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IDictionary <,>)))
                {
                    CreatedType = typeof(Dictionary <,>).MakeGenericType(keyType, valueType);
                }

//#if !(NET40 || NET35 || NET20 || SILVERLIGHT || WINDOWS_PHONE || PORTABLE40)
                IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyDictionary <,>));
//#endif
            }
//#if !(NET40 || NET35 || NET20 || SILVERLIGHT || WINDOWS_PHONE || PORTABLE40)
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IReadOnlyDictionary <,>)))
                {
                    CreatedType = typeof(ReadOnlyDictionary <,>).MakeGenericType(keyType, valueType);
                }

                IsReadOnlyOrFixedSize = true;
            }
//#endif
            else
            {
                ReflectionUtils.GetDictionaryKeyValueTypes(UnderlyingType, out keyType, out valueType);

                if (UnderlyingType == typeof(IDictionary))
                {
                    CreatedType = typeof(Dictionary <object, object>);
                }
            }

            if (keyType != null && valueType != null)
            {
                ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(CreatedType, typeof(KeyValuePair <,>).MakeGenericType(keyType, valueType));
            }

            ShouldCreateWrapper = !typeof(IDictionary).IsAssignableFrom(CreatedType);

            DictionaryKeyType   = keyType;
            DictionaryValueType = valueType;

            if (DictionaryValueType != null)
            {
                _isDictionaryValueTypeNullableType = ReflectionUtils.IsNullableType(DictionaryValueType);
            }

//#if !(NET20 || NET35 || NET40 || PORTABLE40)
            Type       immutableCreatedType;
            MethodBase immutableParameterizedCreator;

            if (ImmutableCollectionsUtils.TryBuildImmutableForDictionaryContract(underlyingType, DictionaryKeyType, DictionaryValueType, out immutableCreatedType, out immutableParameterizedCreator))
            {
                CreatedType             = immutableCreatedType;
                ParametrizedConstructor = immutableParameterizedCreator;
                IsReadOnlyOrFixedSize   = true;
            }
//#endif
        }
Exemplo n.º 6
0
        public JsonDictionaryContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Dictionary;

            Type?keyType;
            Type?valueType;

            if (ReflectionUtils.ImplementsGenericDefinition(NonNullableUnderlyingType, typeof(IDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(NonNullableUnderlyingType, typeof(IDictionary <,>)))
                {
                    CreatedType = typeof(Dictionary <,>).MakeGenericType(keyType, valueType);
                }
                else if (NonNullableUnderlyingType.IsGenericType())
                {
                    // ConcurrentDictionary<,> + IDictionary setter + null value = error
                    // wrap to use generic setter
                    // https://github.com/JamesNK/Newtonsoft.Json/issues/1582
                    var typeDefinition = NonNullableUnderlyingType.GetGenericTypeDefinition();
                    if (typeDefinition.FullName == JsonTypeReflector.ConcurrentDictionaryTypeName)
                    {
                        ShouldCreateWrapper = true;
                    }
                }

#if HAVE_READ_ONLY_COLLECTIONS
                IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(NonNullableUnderlyingType, typeof(ReadOnlyDictionary <,>));
#endif
            }
#if HAVE_READ_ONLY_COLLECTIONS
            else if (ReflectionUtils.ImplementsGenericDefinition(NonNullableUnderlyingType, typeof(IReadOnlyDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(NonNullableUnderlyingType, typeof(IReadOnlyDictionary <,>)))
                {
                    CreatedType = typeof(ReadOnlyDictionary <,>).MakeGenericType(keyType, valueType);
                }

                IsReadOnlyOrFixedSize = true;
            }
#endif
            else
            {
                ReflectionUtils.GetDictionaryKeyValueTypes(NonNullableUnderlyingType, out keyType, out valueType);

                if (NonNullableUnderlyingType == typeof(IDictionary))
                {
                    CreatedType = typeof(Dictionary <object, object>);
                }
            }

            if (keyType != null && valueType != null)
            {
                _parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(
                    CreatedType,
                    typeof(KeyValuePair <,>).MakeGenericType(keyType, valueType),
                    typeof(IDictionary <,>).MakeGenericType(keyType, valueType));

#if HAVE_FSHARP_TYPES
                if (!HasParameterizedCreatorInternal && NonNullableUnderlyingType.Name == FSharpUtils.FSharpMapTypeName)
                {
                    FSharpUtils.EnsureInitialized(NonNullableUnderlyingType.Assembly());
                    _parameterizedCreator = FSharpUtils.Instance.CreateMap(keyType, valueType);
                }
#endif
            }

            if (!typeof(IDictionary).IsAssignableFrom(CreatedType))
            {
                ShouldCreateWrapper = true;
            }

            DictionaryKeyType   = keyType;
            DictionaryValueType = valueType;

#if (NET20 || NET35)
            if (DictionaryValueType != null && ReflectionUtils.IsNullableType(DictionaryValueType))
            {
                // bug in .NET 2.0 & 3.5 that Dictionary<TKey, Nullable<TValue>> throws an error when adding null via IDictionary[key] = object
                // wrapper will handle calling Add(T) instead
                if (ReflectionUtils.InheritsGenericDefinition(CreatedType, typeof(Dictionary <,>), out _))
                {
                    ShouldCreateWrapper = true;
                }
            }
#endif

            if (DictionaryKeyType != null &&
                DictionaryValueType != null &&
                ImmutableCollectionsUtils.TryBuildImmutableForDictionaryContract(
                    NonNullableUnderlyingType,
                    DictionaryKeyType,
                    DictionaryValueType,
                    out var immutableCreatedType,
                    out var immutableParameterizedCreator))
            {
                CreatedType           = immutableCreatedType;
                _parameterizedCreator = immutableParameterizedCreator;
                IsReadOnlyOrFixedSize = true;
            }
        }
Exemplo n.º 7
0
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonArrayContract"/> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        public JsonArrayContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Array;
            IsArray      = CreatedType.IsArray;

            bool canDeserialize;

            Type tempCollectionType;

            if (IsArray)
            {
                CollectionItemType               = ReflectionUtils.GetCollectionItemType(UnderlyingType);
                IsReadOnlyOrFixedSize            = true;
                _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);

                canDeserialize          = true;
                IsMultidimensionalArray = (IsArray && UnderlyingType.GetArrayRank() > 1);
            }
            else if (typeof(IList).IsAssignableFrom(underlyingType))
            {
                if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out _genericCollectionDefinitionType))
                {
                    CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0];
                }
                else
                {
                    CollectionItemType = ReflectionUtils.GetCollectionItemType(underlyingType);
                }

                if (underlyingType == typeof(IList))
                {
                    CreatedType = typeof(List <object>);
                }

                if (CollectionItemType != null)
                {
                    ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(underlyingType, CollectionItemType);
                }

                IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyCollection <>));
                canDeserialize        = true;
            }
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out _genericCollectionDefinitionType))
            {
                CollectionItemType = _genericCollectionDefinitionType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ICollection <>)) ||
                    ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IList <>)))
                {
                    CreatedType = typeof(List <>).MakeGenericType(CollectionItemType);
                }

                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ISet <>)))
                {
                    CreatedType = typeof(HashSet <>).MakeGenericType(CollectionItemType);
                }

                ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(underlyingType, CollectionItemType);
                canDeserialize          = true;
                ShouldCreateWrapper     = true;
            }
//#if !(NET40 || NET35 || NET20 || SILVERLIGHT || WINDOWS_PHONE || PORTABLE40)
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>), out tempCollectionType))
            {
                CollectionItemType = underlyingType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>)) ||
                    ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyList <>)))
                {
                    CreatedType = typeof(ReadOnlyCollection <>).MakeGenericType(CollectionItemType);
                }

                _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);
                ParametrizedConstructor          = CollectionUtils.ResolveEnumableCollectionConstructor(CreatedType, CollectionItemType);
                IsReadOnlyOrFixedSize            = true;
                canDeserialize = (ParametrizedConstructor != null);
            }
//#endif
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IEnumerable <>), out tempCollectionType))
            {
                CollectionItemType = tempCollectionType.GetGenericArguments()[0];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IEnumerable <>)))
                {
                    CreatedType = typeof(List <>).MakeGenericType(CollectionItemType);
                }

                ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(underlyingType, CollectionItemType);

                if (underlyingType.IsGenericType() && underlyingType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
                {
                    _genericCollectionDefinitionType = tempCollectionType;

                    IsReadOnlyOrFixedSize = false;
                    ShouldCreateWrapper   = false;
                    canDeserialize        = true;
                }
                else
                {
                    _genericCollectionDefinitionType = typeof(List <>).MakeGenericType(CollectionItemType);

                    IsReadOnlyOrFixedSize = true;
                    ShouldCreateWrapper   = true;
                    canDeserialize        = (ParametrizedConstructor != null);
                }
            }
            else
            {
                // types that implement IEnumerable and nothing else
                canDeserialize      = false;
                ShouldCreateWrapper = true;
            }

            CanDeserialize = canDeserialize;

            if (CollectionItemType != null)
            {
                _isCollectionItemTypeNullableType = ReflectionUtils.IsNullableType(CollectionItemType);
            }

//#if !(NET20 || NET35 || NET40 || PORTABLE40)
            Type       immutableCreatedType;
            MethodBase immutableParameterizedCreator;

            if (ImmutableCollectionsUtils.TryBuildImmutableForArrayContract(underlyingType, CollectionItemType, out immutableCreatedType, out immutableParameterizedCreator))
            {
                CreatedType             = immutableCreatedType;
                ParametrizedConstructor = immutableParameterizedCreator;
                IsReadOnlyOrFixedSize   = true;
                CanDeserialize          = true;
            }
//#endif
        }
Exemplo n.º 8
0
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonDictionaryContract"/> class.
        /// </summary>
        /// <param name="underlyingType">The underlying type for the contract.</param>
        public JsonDictionaryContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Dictionary;

            Type keyType;
            Type valueType;

            if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IDictionary <,>)))
                {
                    CreatedType = typeof(Dictionary <,>).MakeGenericType(keyType, valueType);
                }

#if !(NET40 || NET35 || NET20 || SILVERLIGHT || WINDOWS_PHONE || PORTABLE40)
                IsReadOnlyOrFixedSize = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyDictionary <,>));
#endif
            }
#if !(NET40 || NET35 || NET20 || SILVERLIGHT || WINDOWS_PHONE || PORTABLE40)
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyDictionary <,>), out _genericCollectionDefinitionType))
            {
                keyType   = _genericCollectionDefinitionType.GetGenericArguments()[0];
                valueType = _genericCollectionDefinitionType.GetGenericArguments()[1];

                if (ReflectionUtils.IsGenericDefinition(UnderlyingType, typeof(IReadOnlyDictionary <,>)))
                {
                    CreatedType = typeof(ReadOnlyDictionary <,>).MakeGenericType(keyType, valueType);
                }

                IsReadOnlyOrFixedSize = true;
            }
#endif
            else
            {
                ReflectionUtils.GetDictionaryKeyValueTypes(UnderlyingType, out keyType, out valueType);

                if (UnderlyingType == typeof(IDictionary))
                {
                    CreatedType = typeof(Dictionary <object, object>);
                }
            }

            if (keyType != null && valueType != null)
            {
                ParametrizedConstructor = CollectionUtils.ResolveEnumableCollectionConstructor(CreatedType, typeof(KeyValuePair <,>).MakeGenericType(keyType, valueType));
            }

            ShouldCreateWrapper = !typeof(IDictionary).IsAssignableFrom(CreatedType);

            DictionaryKeyType   = keyType;
            DictionaryValueType = valueType;

            if (DictionaryValueType != null)
            {
                _isDictionaryValueTypeNullableType = ReflectionUtils.IsNullableType(DictionaryValueType);
            }

#if (NET20 || NET35)
            Type tempDictioanryType;

            // bug in .NET 2.0 & 3.5 that Dictionary<TKey, Nullable<TValue>> throws an error when adding null via IDictionary[key] = object
            // wrapper will handle calling Add(T) instead
            if (_isDictionaryValueTypeNullableType &&
                (ReflectionUtils.InheritsGenericDefinition(CreatedType, typeof(Dictionary <,>), out tempDictioanryType)))
            {
                ShouldCreateWrapper = true;
            }
#endif

#if !(NET20 || NET35 || NET40 || PORTABLE40)
            Type       immutableCreatedType;
            MethodBase immutableParameterizedCreator;
            if (ImmutableCollectionsUtils.TryBuildImmutableForDictionaryContract(underlyingType, DictionaryKeyType, DictionaryValueType, out immutableCreatedType, out immutableParameterizedCreator))
            {
                CreatedType             = immutableCreatedType;
                ParametrizedConstructor = immutableParameterizedCreator;
                IsReadOnlyOrFixedSize   = true;
            }
#endif
        }
Exemplo n.º 9
0
        public JsonArrayContract(Type underlyingType)
        {
            Class6.yDnXvgqzyB5jw();
            base(underlyingType);
            bool hasParameterizedCreatorInternal;
            Type type;
            Type type1;
            ObjectConstructor <object> objectConstructor;

            this.ContractType = JsonContractType.Array;
            this.IsArray      = base.CreatedType.IsArray;
            if (this.IsArray)
            {
                this.CollectionItemType               = ReflectionUtils.GetCollectionItemType(base.UnderlyingType);
                this.IsReadOnlyOrFixedSize            = true;
                this._genericCollectionDefinitionType = typeof(List <>).MakeGenericType(new Type[] { this.CollectionItemType });
                hasParameterizedCreatorInternal       = true;
                this.IsMultidimensionalArray          = (!this.IsArray ? false : base.UnderlyingType.GetArrayRank() > 1);
            }
            else if (typeof(IList).IsAssignableFrom(underlyingType))
            {
                if (!ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out this._genericCollectionDefinitionType))
                {
                    this.CollectionItemType = ReflectionUtils.GetCollectionItemType(underlyingType);
                }
                else
                {
                    this.CollectionItemType = this._genericCollectionDefinitionType.GetGenericArguments()[0];
                }
                if (underlyingType == typeof(IList))
                {
                    base.CreatedType = typeof(List <object>);
                }
                if (this.CollectionItemType != null)
                {
                    this._parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, this.CollectionItemType);
                }
                this.IsReadOnlyOrFixedSize      = ReflectionUtils.InheritsGenericDefinition(underlyingType, typeof(ReadOnlyCollection <>));
                hasParameterizedCreatorInternal = true;
            }
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(ICollection <>), out this._genericCollectionDefinitionType))
            {
                this.CollectionItemType = this._genericCollectionDefinitionType.GetGenericArguments()[0];
                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ICollection <>)) || ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IList <>)))
                {
                    base.CreatedType = typeof(List <>).MakeGenericType(new Type[] { this.CollectionItemType });
                }
                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(ISet <>)))
                {
                    base.CreatedType = typeof(HashSet <>).MakeGenericType(new Type[] { this.CollectionItemType });
                }
                this._parameterizedConstructor  = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, this.CollectionItemType);
                hasParameterizedCreatorInternal = true;
                this.ShouldCreateWrapper        = true;
            }
            else if (ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>), out type))
            {
                this.CollectionItemType = type.GetGenericArguments()[0];
                if (ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyCollection <>)) || ReflectionUtils.IsGenericDefinition(underlyingType, typeof(IReadOnlyList <>)))
                {
                    base.CreatedType = typeof(ReadOnlyCollection <>).MakeGenericType(new Type[] { this.CollectionItemType });
                }
                this._genericCollectionDefinitionType = typeof(List <>).MakeGenericType(new Type[] { this.CollectionItemType });
                this._parameterizedConstructor        = CollectionUtils.ResolveEnumerableCollectionConstructor(base.CreatedType, this.CollectionItemType);
                this.StoreFSharpListCreatorIfNecessary(underlyingType);
                this.IsReadOnlyOrFixedSize      = true;
                hasParameterizedCreatorInternal = this.HasParameterizedCreatorInternal;
            }
            else if (!ReflectionUtils.ImplementsGenericDefinition(underlyingType, typeof(IEnumerable <>), out type))
            {
                hasParameterizedCreatorInternal = false;
                this.ShouldCreateWrapper        = true;
            }
            else
            {
                this.CollectionItemType = type.GetGenericArguments()[0];
                if (ReflectionUtils.IsGenericDefinition(base.UnderlyingType, typeof(IEnumerable <>)))
                {
                    base.CreatedType = typeof(List <>).MakeGenericType(new Type[] { this.CollectionItemType });
                }
                this._parameterizedConstructor = CollectionUtils.ResolveEnumerableCollectionConstructor(underlyingType, this.CollectionItemType);
                this.StoreFSharpListCreatorIfNecessary(underlyingType);
                if (!underlyingType.IsGenericType() || !(underlyingType.GetGenericTypeDefinition() == typeof(IEnumerable <>)))
                {
                    this._genericCollectionDefinitionType = typeof(List <>).MakeGenericType(new Type[] { this.CollectionItemType });
                    this.IsReadOnlyOrFixedSize            = true;
                    this.ShouldCreateWrapper        = true;
                    hasParameterizedCreatorInternal = this.HasParameterizedCreatorInternal;
                }
                else
                {
                    this._genericCollectionDefinitionType = type;
                    this.IsReadOnlyOrFixedSize            = false;
                    this.ShouldCreateWrapper        = false;
                    hasParameterizedCreatorInternal = true;
                }
            }
            this.CanDeserialize = hasParameterizedCreatorInternal;
            if (ImmutableCollectionsUtils.TryBuildImmutableForArrayContract(underlyingType, this.CollectionItemType, out type1, out objectConstructor))
            {
                base.CreatedType           = type1;
                this._parameterizedCreator = objectConstructor;
                this.IsReadOnlyOrFixedSize = true;
                this.CanDeserialize        = true;
            }
        }