private static string GetTypeName(Type type)
        {
            var typeName = type.Name;

            if (IsDictionary(type))
            {
                typeName = type.GetGenericArguments()[1].Name + "Map";
            }

            if (TypeBuilderHelper.IsArrayOrEnumerable(type))
            {
                typeName = "ListOf" + GetTypeName(GetElementType(type));
            }

            return(typeName.Replace("`", string.Empty));
        }
        protected string GetRecursively(Type type, int pad, IEnumerable <CustomAttributeData> customAttributes)
        {
            if (type.IsGenericType && TypeBuilderHelper.IsGenericWebResult(type))
            {
                type = type.GetGenericArguments()[0];
            }

            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary <,>))
            {
                return(null);
            }

            if (TypeBuilderHelper.IsArrayOrEnumerable(type))
            {
                var elementType = type.GetElementType() ?? type.GetGenericArguments()[0];

                if (SchemaTypeMapper.Map(elementType) != null)
                {
                    return(GetNestedArraySchemaPrimitiveType(pad, elementType));
                }

                if (elementType.IsGenericType && elementType.GetGenericTypeDefinition() == typeof(KeyValuePair <,>))
                {
                    return(GetNestedArraySchema(pad, elementType));
                }

                if (elementType.GetProperties().Count(p => p.CanRead || p.CanWrite) == 0)
                {
                    return(string.Empty);
                }

                return(GetNestedArraySchema(pad, elementType));
            }

            if (type.GetProperties().Count(p => p.CanRead || p.CanWrite) == 0)
            {
                return(string.Empty);
            }

            return(GetNestedObjectSchema(type, pad, customAttributes));
        }
        public string Get(Type type)
        {
            definitions.Clear();
            Types.Clear();

            string schema;

            if (type.IsGenericType && TypeBuilderHelper.IsGenericWebResult(type))
            {
                type = type.GetGenericArguments()[0];
            }

            if (TypeBuilderHelper.IsArrayOrEnumerable(type))
            {
                var elementType = type.GetElementType() ?? type.GetGenericArguments()[0];
                if (elementType.GetProperties().Count(p => p.CanRead || p.CanWrite) == 0)
                {
                    return(null);
                }

                schema = GetArray(elementType);
            }
            else
            {
                if (type.GetProperties().Count(p => p.CanRead || p.CanWrite) == 0)
                {
                    return(null);
                }

                schema = GetMainObjectSchema(type);
            }

            schema = AddDefinitionsIfAny(schema);

            schema += "}" + Environment.NewLine;

            return(schema);
        }
        private RamlType GetProperty(PropertyInfo prop)
        {
            if (prop.PropertyType.GetTypeInfo().IsEnum)
            {
                return(GetEnum(prop.PropertyType));
            }

            if (Raml1TypeMapper.Map(prop.PropertyType) != null)
            {
                return(HandlePrimitiveTypeProperty(prop));
            }

            if (TypeBuilderHelper.IsArrayOrEnumerable(prop.PropertyType))
            {
                return(GetArray(prop.PropertyType));
            }

            if (IsDictionary(prop.PropertyType))
            {
                return(GetMap(prop.PropertyType));
            }

            return(HandleNestedTypeProperty(prop));
        }
        public string Add(Type type)
        {
            var typeName = GetTypeName(type);

            if (types.Contains(type))
            {
                return(typeName);
            }

            RamlType raml1Type;

            if (type.GetTypeInfo().IsGenericType&& TypeBuilderHelper.IsGenericWebResult(type))
            {
                type = type.GetGenericArguments()[0];
            }

            if (TypeBuilderHelper.IsArrayOrEnumerable(type))
            {
                var elementType = GetElementType(type);
                if (TypeBuilderHelper.IsArrayOrEnumerable(elementType))
                {
                    var subElementType = GetElementType(elementType);

                    if (Raml1TypeMapper.Map(subElementType) != null)
                    {
                        return(Raml1TypeMapper.Map(subElementType) + "[][]");
                    }

                    if (!HasPropertiesOrParentType(subElementType))
                    {
                        return(string.Empty);
                    }

                    types.Add(type);

                    raml1Type = GetArrayOfArray(subElementType);
                }
                else
                {
                    if (Raml1TypeMapper.Map(elementType) != null)
                    {
                        return(Raml1TypeMapper.Map(elementType) + "[]");
                    }

                    if (!HasPropertiesOrParentType(elementType))
                    {
                        return(string.Empty);
                    }

                    types.Add(type);

                    raml1Type = GetArray(elementType);
                }
            }
            else if (IsDictionary(type) || IsParentADictionary(type))
            {
                types.Add(type);
                raml1Type = GetMap(type);
            }
            else if (type.GetTypeInfo().IsEnum)
            {
                types.Add(type);
                raml1Type = GetEnum(type);
            }
            else if (Raml1TypeMapper.Map(type) != null)
            {
                //raml1Type = GetScalar(type);
                raml1Type = null;
                typeName  = Raml1TypeMapper.Map(type);
            }
            else
            {
                if (!HasPropertiesOrParentType(type))
                {
                    return(string.Empty);
                }

                types.Add(type);
                raml1Type = GetObject(type);
            }

            if (raml1Type != null)
            {
                AddType(type, raml1Type);
            }

            return(typeName);
        }