public static SwaggerType GetSwaggerType(Type type) { var swaggerType = new SwaggerType(); //Dig until finding a suitable type if (RegexRecursiveTypes.IsMatch(type.Name.ToLower())) { return GetSwaggerType(type.GetGenericArguments().First()); } if (typeof(IEnumerable<object>).IsAssignableFrom(type) || type.IsArray) { swaggerType.Name = "array"; Type arrayType; if (type.IsGenericType) { arrayType = type.GetGenericArguments().First(); } else { arrayType = type.GetElementType(); } swaggerType.Items = new ItemInfo { Ref = GetTypeName(arrayType) }; swaggerType.type = arrayType; } else { swaggerType.Name = GetTypeName(type); swaggerType.type = type; } return swaggerType; }
public static SwaggerType GetSwaggerType(Type type) { var swaggerType = new SwaggerType(); //Dig until finding a suitable type if (RegexRecursiveTypes.IsMatch(type.Name.ToLower())) { return(GetSwaggerType(type.GetGenericArguments().First())); } if (typeof(IEnumerable <object>).IsAssignableFrom(type) || type.IsArray) { swaggerType.Name = "array"; Type arrayType; if (type.IsGenericType) { arrayType = type.GetGenericArguments().First(); } else { arrayType = type.GetElementType(); } swaggerType.Items = new ItemInfo { Ref = GetTypeName(arrayType) }; swaggerType.type = arrayType; } else { swaggerType.Name = GetTypeName(type); swaggerType.type = type; } return(swaggerType); }
/// <summary> /// Creates an api operation /// </summary> /// <param name="api">Description of the api via the ApiExplorer</param> /// <param name="docProvider">Access to the XML docs written in code</param> /// <returns>An api operation</returns> public static ResourceApiOperation CreateResourceApiOperation(ApiDescription api, XmlCommentDocumentationProvider docProvider) { ResponseMeta responseMeta = docProvider.GetResponseType(api.ActionDescriptor); SwaggerType swaggerType = Helper.GetSwaggerType(responseMeta.Type); ResourceApiOperation rApiOperation = new ResourceApiOperation { httpMethod = api.HttpMethod.ToString(), nickname = docProvider.GetNickname(api.ActionDescriptor), items = swaggerType.Items, type = swaggerType.Name, summary = api.Documentation, notes = docProvider.GetNotes(api.ActionDescriptor), parameters = new List <ResourceApiOperationParameter>(), responseMessages = docProvider.GetResponseCodes(api.ActionDescriptor) }; var typesToReturn = new ConcurrentDictionary <string, string>(); Helper.TryToAddModels(models, responseMeta.Type, docProvider, typesToReturn); return(rApiOperation); }
public static void TryToAddModels(ConcurrentDictionary <string, TypeInfo> models, Type type, XmlCommentDocumentationProvider docProvider, ConcurrentDictionary <string, string> typesToReturn = null, int level = 0) { var _type = type; if (type.IsArray) { _type = type.GetElementType(); } else if (type.IsGenericType) { _type = type.GetGenericArguments().First(); } string typeName = GetTypeName(_type); if (models.Any(m => m.Key == typeName)) { return; } if (IsOutputable(_type)) { var typeInfo = new TypeInfo { id = typeName }; if (!IgnoreTypes.Contains(_type.Name.ToLower())) { typeInfo.description = docProvider.GetSummary(_type); } //Ignore properties for .net types if (!_type.Assembly.FullName.Contains("System") && !_type.Assembly.FullName.Contains("mscorlib")) { var modelInfoDic = new Dictionary <string, PropInfo>(); foreach (var propertyInfo in _type.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (propertyInfo.GetCustomAttributes(typeof(JsonIgnoreAttribute), false).FirstOrDefault() != null) { continue; } var propInfo = new PropInfo(); string propName = GetPropertyName(propertyInfo); Type propType = docProvider.GetType(propertyInfo); SwaggerType swaggerType = GetSwaggerType(propType); propInfo.type = swaggerType.Name; propInfo.items = swaggerType.Items; propInfo.required = IsRequired(propertyInfo, docProvider); if (!modelInfoDic.Keys.Contains(propName)) { modelInfoDic.Add(propName, propInfo); } if (!IgnoreTypes.Contains(propInfo.type)) { propInfo.description = docProvider.GetSummary(propertyInfo); if (propertyInfo.PropertyType.IsEnum) { modelInfoDic[propName].@enum = propertyInfo.PropertyType.GetEnumNames(); } //Don't go too deep if (level < 10) { TryToAddModels(models, swaggerType.type, docProvider, typesToReturn, ++level); } } } typeInfo.properties = modelInfoDic; } if (_type.IsEnum) { typeInfo.values = _type.GetEnumNames(); } models.TryAdd(typeName, typeInfo); } }