private void BuildTable <T>(MarkdownBuilder mb, string label, T[] array, Func <T, string> type, Func <T, string> name, Func <T, string> finalName, Func <T, XmlDocumentComment, bool> get) { if (array.Any()) { mb.Header(2, label); mb.AppendLine(); IEnumerable <T> seq = array; if (!this.type.IsEnum) { seq = array.OrderBy(name); } IEnumerable <MarkdownBuilder.DropdownItem> data = seq.Select( item2 => { XmlDocumentComment _lookupInterfaces(Type t) { XmlDocumentComment lookup = null; Type[] interfaces = t.GetInterfaces(); for (int i = 0; i < interfaces.Length && lookup == null; i++) { lookup = commentLookup[interfaces[i].FullName] .FirstOrDefault( x => (x.MemberName == name(item2) || x.MemberName.StartsWith(name(item2) + "`")) && get(item2, x)); if (lookup == null || (lookup.Summary?.Trim() .Equals( "inheritdoc", StringComparison.InvariantCultureIgnoreCase) ?? true)) { lookup = _lookupInterfaces(interfaces[i]); } } return(lookup); } XmlDocumentComment _lookupType(Type t) { if (t == null) { return(null); } XmlDocumentComment lookup = commentLookup[t.FullName] .FirstOrDefault( x => (x.MemberName == name(item2) || x.MemberName.StartsWith(name(item2) + "`")) && get(item2, x)); if (lookup == null || (lookup.Summary?.Trim() .Equals( "inheritdoc", StringComparison.InvariantCultureIgnoreCase) ?? true)) { lookup = _lookupInterfaces(t) ?? _lookupType(t.BaseType); } return(lookup); } return(new MarkdownBuilder.DropdownItem { Type = MarkdownBuilder.MarkdownCodeQuote(type(item2)), Name = finalName(item2), XmlDocumentComment = _lookupType(this.type) }); }); mb.Dropdown(data); mb.AppendLine("___"); } }