protected string GetJSTypeName(Type sourceType, Type propertyType, QuickGraph.AdjacencyGraph <Type, QuickGraph.Edge <Type> > graph)
        {
            if (propertyType.IsGenericParameter)
            {
                return(propertyType.Name);
            }
            var overrideTypeName = this._options.TryGetTypeName(propertyType);

            if (String.IsNullOrWhiteSpace(overrideTypeName))
            {
                if (propertyType.IsGenericType)
                {
                    if (IsGenericTypeNullable(propertyType))
                    {
                        return("?" + GetJSTypeName(sourceType, Nullable.GetUnderlyingType(propertyType), graph));
                    }
                    var dictionaryType = propertyType.GetInterfaces().SingleOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition().Equals(typeof(IDictionary <,>)));
                    if (null != dictionaryType)
                    {
                        var typeArgs  = dictionaryType.GetGenericArguments().ToArray();
                        var keyType   = typeArgs[0];
                        var valueType = typeArgs[1];
                        return(GetJSObjectTypeName(sourceType, keyType, valueType, graph));
                    }
                    var enumerableType = propertyType.GetInterfaces().SingleOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition().Equals(typeof(IEnumerable <>)));
                    if (null != enumerableType)
                    {
                        return(GetJSArrayTypeName(sourceType, enumerableType.GetGenericArguments().Single(), graph));
                    }
                }
                if (propertyType.IsArray)
                {
                    var elementType = propertyType.GetElementType();
                    return(GetJSArrayTypeName(sourceType, elementType, graph));
                }
            }
            graph.AddVertex(propertyType);
            graph.AddVertex(sourceType);
            if (InAllowedAssemblies(propertyType))
            {
                graph.AddEdge(new QuickGraph.Edge <Type>(sourceType, propertyType));
                return(this.GetFullTypeName(propertyType));
            }
            return(overrideTypeName ?? GetTypeName(propertyType));
        }