Example #1
0
        /// <summary>
        /// </summary>
        /// <param name="baseType">The property type that is get or set (aka the assignable type).</param>
        internal ConfigTypeJsonConverter(Type baseType) //, JsonSerializer innerSerializer)
        {
            Contract.Requires <ArgumentNullException>(baseType != null);
            //Contract.Requires<ArgumentNullException>(innerSerializer != null);

            //_innerSerializer = innerSerializer;

            _baseType = baseType;
            // Determine possible types
            _possibleTypes = LogJamConfigTypes.GetConcreteTypesFor(baseType).ToArray();
            // Create property name => types Lookup
            _typesWithProperty = _possibleTypes.SelectMany(type => type.GetProperties().Select(property => new
            {
                type,
                property
            }))
                                 .ToLookup(a => a.property.Name, a => a.type);
            // Create TypeHint -> type lookup
            _typesWithTypeHint = _possibleTypes.SelectMany(type => JsonTypeHintAttribute.For(type).Select(jsonHint => new
            {
                jsonHint,
                type
            }))
                                 .ToLookup(a => a.jsonHint, a => a.type);
            // Create list of TypeHint properties
            _typeHintProperties = new HashSet <string>(_typesWithTypeHint.Select(grouping => grouping.Key.Property), StringComparer.OrdinalIgnoreCase);
        }
        public JsonContract ResolveContract(Type type)
        {
            JsonContract contract = _innerContractResolver.ResolveContract(type);

            if ((contract is JsonObjectContract) &&
                LogJamConfigTypes.IsRegisteredAssignableType(type))
            {
                contract.Converter = new ConfigTypeJsonConverter(type); //, _innerSerializer);
            }

            return(contract);
        }