internal void Add(MethodDescriptor method) { _methods[method.FullName] = method; }
private void InitMembers() { foreach (XmlNode xmlNode in _xmlDoc) { if (xmlNode.NodeType == XmlNodeType.Comment || xmlNode.Name != "member") { continue; } var name = xmlNode.Attributes["name"]?.Value.Trim(); if (name == null) { continue; } var prefix = name[0]; var typeName = name.Substring(2); var fullName = typeName; var summary = xmlNode.GetInnerXml("summary"); switch (prefix) { case 'T': { if (!_members.TryGetValue(typeName, out var type)) { type = new TypeDescriptor(fullName, summary); _members[type.FullName] = type; } else { type.Summary ??= summary; } type.Assembly = this; } break; case 'P': case 'F': { var index = typeName.LastIndexOf('.'); name = typeName.Substring(index + 1); typeName = typeName.Substring(0, index); if (!_members.TryGetValue(typeName, out var ptype)) { throw new NullReferenceException($"类型{typeName}不能为空!"); } ptype.IsEnum = prefix == 'F'; ptype.Add(new PropertyDescriptor(ptype, name, summary, fullName)); } break; case 'M': { var index = typeName.IndexOf('('); if (index != -1) { typeName = typeName.Substring(0, index); } index = typeName.LastIndexOf('.'); name = typeName.Substring(index + 1); typeName = typeName.Substring(0, index); if (!_members.TryGetValue(typeName, out var mtype)) { mtype = new TypeDescriptor(typeName, null); _members[mtype.FullName] = mtype; } var method = new MethodDescriptor(mtype, name, summary, fullName); mtype.Add(method); var @params = xmlNode.SelectNodes("param"); foreach (XmlNode param in @params) { if (param.NodeType == XmlNodeType.Comment) { continue; } method.Add(new ParameterDescriptor(null, param.Attributes["name"]?.Value.Trim(), method, param.InnerXml.Trim())); } var returns = xmlNode.SelectSingleNode("returns"); if (returns != null) { method.Returns = new ReturnDescriptor(null, method, returns.InnerXml.Trim()); } } break; } } }