private string GetCustomTypeMembers(Type customType, int level = 0) { if (level > 3) { return(""); } level++; StringBuilder sb = new StringBuilder();; var xmlNode = GetXmlComment(customType); foreach (var prop in customType.GetProperties()) { var comment = prop.GetCustomAttribute <JimuFieldCommentAttribute>(); var proComment = comment == null ? "" : (" | " + comment?.Comment); var key = XmlCommentsMemberNameHelper.GetMemberNameForMember(prop); if (comment == null && xmlNode != null && xmlNode.TryGetValue(key, out var node)) { proComment = $" | " + node.Value.Trim(); } proComment = FilterJson(proComment); if (prop.PropertyType.IsClass && !prop.PropertyType.FullName.StartsWith("System.")) { sb.Append($"\"{prop.Name}\":{{{GetCustomTypeMembers(prop.PropertyType, level)}}},"); } else if (prop.PropertyType.IsClass && prop.PropertyType.FullName.StartsWith("System.Collections.Generic.List") && prop.PropertyType.GenericTypeArguments.Length == 1 ) { if (prop.PropertyType.GenericTypeArguments[0].FullName.StartsWith("System.")) { sb.Append($"\"{prop.Name}\":\"[{prop.PropertyType.GenericTypeArguments[0].FullName}]\","); } else { sb.Append($"\"{prop.Name}\":[{{{GetCustomTypeMembers(prop.PropertyType.GenericTypeArguments[0], level)}}}],"); } } else if (prop.PropertyType.IsClass && prop.PropertyType.FullName.StartsWith("System.Collections.Generic.Dictionary")) { sb.Append($"\"{prop.Name}\":\"{prop.PropertyType.ToString().Replace("System.Collections.Generic.Dictionary`2", "")}{proComment}\","); } else { sb.Append($"\"{prop.Name}\":\"{prop.PropertyType.ToString()}{proComment}\","); } } return(sb.ToString().TrimEnd(',')); }
private List <JimuServiceParameterDesc> GetProperties(Type customType, int level = 0, string specifyName = null) { if (level > 3 || customType == null) { return(null); } level++; StringBuilder sb = new StringBuilder();; var xmlNode = GetXmlComment(customType); List <JimuServiceParameterDesc> list = new List <JimuServiceParameterDesc>(); if (customType.IsArray) { var arrayBaseType = customType.Assembly.ExportedTypes.FirstOrDefault(x => x.FullName == customType.FullName.TrimEnd('[', ']')); return(new List <JimuServiceParameterDesc> { new JimuServiceParameterDesc { Name = specifyName ?? customType.Name, //Type = customType.ToString().TrimEnd('[',']') Type = customType.ToString(), Properties = GetProperties(arrayBaseType) } }); } else if (customType.IsEnum) { return(new List <JimuServiceParameterDesc> { new JimuServiceParameterDesc { Name = specifyName ?? customType.Name, Type = "System.Int", } }); } else if (!customType.GetProperties().Any() || (customType.FullName.StartsWith("System.") && !customType.FullName.StartsWith("System.Collections"))) { if (customType.FullName.StartsWith("System.")) { return(new List <JimuServiceParameterDesc> { new JimuServiceParameterDesc { Name = specifyName ?? customType.Name, Type = customType.ToString(), } }); } return(null); } foreach (var prop in customType.GetProperties()) { var comment = prop.GetCustomAttribute <JimuFieldCommentAttribute>(); //var proComment = comment == null ? "" : (" | " + comment?.Comment); var proComment = comment == null ? "" : ("" + comment?.Comment); var key = XmlCommentsMemberNameHelper.GetMemberNameForMember(prop); if (comment == null && xmlNode != null && xmlNode.TryGetValue(key, out var node)) { //proComment = $" | " + node.Value.Trim(); proComment = node.Value.Trim(); } proComment = FilterJson(proComment); var paraDesc = new JimuServiceParameterDesc { Comment = proComment, Name = prop.Name, Type = prop.PropertyType.ToString(), }; if (prop.PropertyType.IsArray) { paraDesc.Properties = new List <JimuServiceParameterDesc> { new JimuServiceParameterDesc { Type = prop.PropertyType.ToString().TrimEnd('[', ']') } }; } if (prop.PropertyType.IsClass && !prop.PropertyType.FullName.StartsWith("System.")) { paraDesc.Properties = GetProperties(prop.PropertyType, level); } else if (prop.PropertyType.IsClass && prop.PropertyType.FullName.StartsWith("System.Collections.Generic.List") && prop.PropertyType.GenericTypeArguments.Length == 1 ) { paraDesc.Properties = GetProperties(prop.PropertyType.GenericTypeArguments[0], level); } else if (prop.PropertyType.IsClass && prop.PropertyType.FullName.StartsWith("System.Collections.Generic.Dictionary")) { var keyPros = GetProperties(prop.PropertyType.GenericTypeArguments[0], level, "key"); var valPros = GetProperties(prop.PropertyType.GenericTypeArguments[1], level, "value"); if (valPros.Count > 1) { keyPros.Add(new JimuServiceParameterDesc { Name = "value", Properties = valPros }); } else { keyPros.AddRange(valPros); } paraDesc.Properties = keyPros; } list.Add(paraDesc); } return(list); }