protected override TypeReference InferType()

in packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/Converters/JsiiToFrameworkConverter.cs [264:336]


        protected override TypeReference InferType(IReferenceMap referenceMap, object value)
        {
            value = value ?? throw new ArgumentNullException(nameof(value));

            if (value is JToken token)
            {
                switch (token.Type)
                {
                    case JTokenType.Object:
                        JObject jObject = (JObject)token;
                        if (jObject.ContainsKey("$jsii.date"))
                        {
                            return new TypeReference(primitive: PrimitiveType.Date);
                        }
                        if (jObject.ContainsKey("$jsii.enum"))
                        {
                            return new TypeReference(jObject.ToObject<EnumValue>()!.FullyQualifiedName);
                        }
                        if (jObject.ContainsKey("$jsii.byref"))
                        {
                            return new TypeReference(jObject.ToObject<ByRefValue>()!.FullyQualifiedName);
                        }

                        // At this point, we can't distinguish between a PrimitiveType.Json and a CollectionKind.Map,
                        // so we default to CollectionKind.Map.
                        return new TypeReference(
                            collection: new CollectionTypeReference(
                                kind: CollectionKind.Map,
                                elementType: new TypeReference(primitive: PrimitiveType.Any)
                            )
                        );

                    case JTokenType.Array:
                        return new TypeReference
                        (
                            collection: new CollectionTypeReference
                            (
                                kind: CollectionKind.Array,
                                elementType: new TypeReference(primitive: PrimitiveType.Any)
                            )
                        );

                    case JTokenType.Boolean:
                        return new TypeReference(primitive: PrimitiveType.Boolean);
                    case JTokenType.String:
                        return new TypeReference(primitive: PrimitiveType.String);
                    case JTokenType.Float:
                    case JTokenType.Integer:
                        return new TypeReference(primitive: PrimitiveType.Number);
                    default:
                        throw new ArgumentException($"Value has unexpected token type {token.Type}", nameof(value));
                }
            }

            System.Type type = value.GetType();

            if (type.IsAssignableFrom(typeof(string)))
            {
                return new TypeReference(primitive: PrimitiveType.String);
            }

            if (type.IsAssignableFrom(typeof(bool)))
            {
                return new TypeReference(primitive: PrimitiveType.Boolean);
            }

            if (IsNumeric(type))
            {
                return new TypeReference(primitive: PrimitiveType.Number);
            }

            throw new ArgumentException($"Value has unexpected type {type.Name}", nameof(value));
        }