public Type GetFrameworkType()

in packages/@jsii/dotnet-runtime/src/Amazon.JSII.Runtime/Services/TypeCache.cs [52:124]


        public Type GetFrameworkType(TypeReference typeReference, bool isOptional)
        {
            if (typeReference.FullyQualifiedName != null)
            {
                var classType = TryGetClassType(typeReference.FullyQualifiedName);
                if (classType != null)
                {
                    return classType;
                }

                var enumType = TryGetEnumType(typeReference.FullyQualifiedName);
                if (enumType != null)
                {
                    return MakeNullableIfOptional(enumType);
                }

                var interfaceType = TryGetInterfaceType(typeReference.FullyQualifiedName);
                if (interfaceType != null)
                {
                    return interfaceType;
                }

                throw new ArgumentException("Type reference has a fully qualified name, but is neither a class nor an enum", nameof(typeReference));
            }

            if (typeReference.Primitive != null)
            {
                switch (typeReference.Primitive)
                {
                    case PrimitiveType.Any:
                        return typeof(object);
                    case PrimitiveType.Boolean:
                        return MakeNullableIfOptional(typeof(bool));
                    case PrimitiveType.Date:
                        return MakeNullableIfOptional(typeof(DateTime));
                    case PrimitiveType.Json:
                        return typeof(JObject);
                    case PrimitiveType.Number:
                        return MakeNullableIfOptional(typeof(double));
                    case PrimitiveType.String:
                        return typeof(string);
                    default:
                        throw new ArgumentException($"Unknown primitive type {typeReference.Primitive}", nameof(typeReference));

                }
            }

            if (typeReference.Collection != null)
            {
                Type elementType = GetFrameworkType(typeReference.Collection.ElementType, false);
                switch (typeReference.Collection.Kind)
                {
                    case CollectionKind.Array:
                        return elementType.MakeArrayType();
                    case CollectionKind.Map:
                        return typeof(IDictionary<,>).MakeGenericType(typeof(string), elementType);
                    default:
                        throw new ArgumentException($"Unknown collection kind {typeReference.Collection.Kind}", nameof(typeReference));
                }
            }

            if (typeReference.Union != null)
            {
                return typeof(object);
            }

            throw new ArgumentException("Invalid type reference", nameof(typeReference));

            Type MakeNullableIfOptional(Type type)
            {
                return isOptional ? typeof(Nullable<>).MakeGenericType(type) : type;
            }
        }