JsonObjectContract
Contract details for a  Type used by the  JsonSerializer.
            
                using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Utilities;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Security;
namespace Newtonsoft.Json.Serialization
{
    [System.Runtime.CompilerServices.NullableContext(2)]
    [System.Runtime.CompilerServices.Nullable(0)]
    public class JsonObjectContract : JsonContainerContract
    {
        internal bool ExtensionDataIsJToken;
        private bool? _hasRequiredOrDefaultValueProperties;
        [System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })]
        private ObjectConstructor<object> _overrideCreator;
        [System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })]
        private ObjectConstructor<object> _parameterizedCreator;
        private JsonPropertyCollection _creatorParameters;
        private Type _extensionDataValueType;
        public MemberSerialization MemberSerialization { get; set; }
        public MissingMemberHandling? MissingMemberHandling { get; set; }
        public Required? ItemRequired { get; set; }
        public NullValueHandling? ItemNullValueHandling { get; set; }
        [System.Runtime.CompilerServices.Nullable(1)]
        [field: System.Runtime.CompilerServices.Nullable(1)]
        public JsonPropertyCollection Properties {
            [System.Runtime.CompilerServices.NullableContext(1)]
            get;
        }
        [System.Runtime.CompilerServices.Nullable(1)]
        public JsonPropertyCollection CreatorParameters {
            [System.Runtime.CompilerServices.NullableContext(1)]
            get {
                if (_creatorParameters == null)
                    _creatorParameters = new JsonPropertyCollection(base.UnderlyingType);
                return _creatorParameters;
            }
        }
        [System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })]
        public ObjectConstructor<object> OverrideCreator {
            [return: System.Runtime.CompilerServices.Nullable(new byte[] {
                2,
                1
            })]
            get {
                return _overrideCreator;
            }
            [param: System.Runtime.CompilerServices.Nullable(new byte[] {
                2,
                1
            })]
            set {
                _overrideCreator = value;
            }
        }
        [System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1
        })]
        internal ObjectConstructor<object> ParameterizedCreator {
            [return: System.Runtime.CompilerServices.Nullable(new byte[] {
                2,
                1
            })]
            get {
                return _parameterizedCreator;
            }
            [param: System.Runtime.CompilerServices.Nullable(new byte[] {
                2,
                1
            })]
            set {
                _parameterizedCreator = value;
            }
        }
        public ExtensionDataSetter ExtensionDataSetter { get; set; }
        public ExtensionDataGetter ExtensionDataGetter { get; set; }
        public Type ExtensionDataValueType {
            get {
                return _extensionDataValueType;
            }
            set {
                _extensionDataValueType = value;
                ExtensionDataIsJToken = (value != (Type)null && typeof(JToken).IsAssignableFrom(value));
            }
        }
        [System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1,
            1
        })]
        [field: System.Runtime.CompilerServices.Nullable(new byte[] {
            2,
            1,
            1
        })]
        public Func<string, string> ExtensionDataNameResolver {
            [return: System.Runtime.CompilerServices.Nullable(new byte[] {
                2,
                1,
                1
            })]
            get;
            [param: System.Runtime.CompilerServices.Nullable(new byte[] {
                2,
                1,
                1
            })]
            set;
        }
        internal bool HasRequiredOrDefaultValueProperties {
            get {
                if (!_hasRequiredOrDefaultValueProperties.HasValue) {
                    _hasRequiredOrDefaultValueProperties = false;
                    if (ItemRequired.GetValueOrDefault(Required.Default) != 0)
                        _hasRequiredOrDefaultValueProperties = true;
                    else {
                        using (IEnumerator<JsonProperty> enumerator = Properties.GetEnumerator()) {
                            while (true) {
                                if (enumerator.MoveNext()) {
                                    JsonProperty current = enumerator.Current;
                                    if (current.Required == Required.Default) {
                                        DefaultValueHandling? nullable = (DefaultValueHandling?)((int?)current.DefaultValueHandling & 2);
                                        DefaultValueHandling defaultValueHandling = DefaultValueHandling.Populate;
                                        if (!((nullable.GetValueOrDefault() == defaultValueHandling) & nullable.HasValue))
                                            continue;
                                    }
                                    _hasRequiredOrDefaultValueProperties = true;
                                }
                                break;
                            }
                        }
                    }
                }
                return _hasRequiredOrDefaultValueProperties.GetValueOrDefault();
            }
        }
        [System.Runtime.CompilerServices.NullableContext(1)]
        public JsonObjectContract(Type underlyingType)
            : base(underlyingType)
        {
            ContractType = JsonContractType.Object;
            Properties = new JsonPropertyCollection(base.UnderlyingType);
        }
        [System.Runtime.CompilerServices.NullableContext(1)]
        [SecuritySafeCritical]
        internal object GetUninitializedObject()
        {
            if (!JsonTypeReflector.FullyTrusted)
                throw new JsonException("Insufficient permissions. Creating an uninitialized '{0}' type requires full trust.".FormatWith(CultureInfo.InvariantCulture, NonNullableUnderlyingType));
            return FormatterServices.GetUninitializedObject(NonNullableUnderlyingType);
        }
    }
}