private string GetCustomTypeMembers(Type customType) { StringBuilder sb = new StringBuilder();; var xmlNode = GetXmlComment(customType); foreach (var prop in customType.GetProperties()) { if (prop.PropertyType.IsClass && !prop.PropertyType.FullName.StartsWith("System.")) { sb.Append($"\"{prop.Name}\":{{{GetCustomTypeMembers(prop.PropertyType)}}},"); } else if (prop.PropertyType.IsClass && prop.PropertyType.FullName.StartsWith("System.Collections.Generic.List") && prop.PropertyType.GenericTypeArguments.Length == 1 ) { sb.Append($"\"{prop.Name}\":[{{{GetCustomTypeMembers(prop.PropertyType.GenericTypeArguments[0])}}}],"); } else { 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); sb.Append($"\"{prop.Name}\":\"{prop.PropertyType.ToString()}{proComment}\","); } } return(sb.ToString().TrimEnd(',')); }