using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //using System.Web.Mvc; using Song.Entities; using Song.ServiceInterfaces; using Song.ViewData.Attri; using WeiSha.Common; using System.Reflection; using System.Xml; namespace Song.ViewData.Methods { /// /// 接口方法的帮助 /// [HttpGet] public class Helper : IViewAPI { /// /// 接口方法列表 /// /// [HttpPost] public Helper_API[] List() { List list = new List(); string assemblyName = "Song.ViewData"; Assembly assembly = Assembly.Load(assemblyName); //取注释 XmlNodeList nodes = readXml(); Type[] types = assembly.GetExportedTypes() .Where(t => t.GetInterfaces().Contains(typeof(IViewAPI))) .ToArray(); foreach (Type info in types) { string intro = string.Empty; if (nodes != null) { foreach (XmlNode n in nodes) { string name = n.Attributes["name"].Value; if (("T:" + info.FullName).Equals(name)) { intro = n.InnerText.Trim(); break; } } } list.Add(new Helper_API() { Name = info.Name, Intro = intro }); } list.Sort((a, b) => a.Name.CompareTo(b.Name)); return list.ToArray(); } /// /// 某个接口类下的方法 /// /// 类名称 /// /// 备注信息 /// /// 异常 [HttpGet] public Helper_API_Method[] Methods(string classname) { string assemblyName = "Song.ViewData"; string classFullName = String.Format("{0}.Methods.{1}", assemblyName, classname); Assembly assembly = Assembly.Load(assemblyName); //当前类的反射对象 Type classtype = null; foreach (Type info in assembly.GetExportedTypes()) { if (info.FullName.Equals(classFullName, StringComparison.CurrentCultureIgnoreCase)) { classtype = info; break; } } //注释文档 XmlNodeList nodes = readXml(); //类下面的方法,仅获取当前类生成的方法,不包括父类 List list = new List(); MemberInfo[] mis = classtype.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public); foreach (MethodInfo mi in mis) { string fullname = Helper_API_Method.GetFullName(mi); //带参数的方法名称 //方法的注释 XmlNode node = Helper_API_Method.GetNode(mi, nodes); list.Add(new Helper_API_Method() { Name = mi.Name, FullName = fullname, Paras = Helper_API_Method_Para.GetParas(mi, node), Return = Helper_API_Method_Return.GetReturn(mi, node), ClassName = mi.DeclaringType.Name, Class = mi.DeclaringType.FullName, Intro = Helper_API_Method.GetHelp(node, "summary"), Remarks = Helper_API_Method.GetHelp(node, "remarks"), Example = Helper_API_Method.GetHelp(node, "example"), Attrs = Helper_API_Method_Attr.GetAttrs(mi) }); } //按方法名排序 list.Sort((a, b) => a.Name.CompareTo(b.Name)); return list.ToArray(); } private XmlNodeList readXml() { XmlNodeList nodes = null; string file = WeiSha.Common.Server.MapPath("/bin/Song.ViewData.XML"); if (!System.IO.File.Exists(file)) return nodes; XmlDocument xml = new XmlDocument(); xml.Load(file); nodes = xml.SelectNodes("/doc/members/member"); return nodes; } } #region 一些需要用到的类 //接口类 public class Helper_API { public string Name { get; set; } public string Intro { get; set; } } //接口类中的方法 public class Helper_API_Method { public string Name { get; set; } //方法名 public string FullName { get; set; } //方法全名 public string Intro { get; set; } //方法摘要说明 public string Remarks { get; set; } //方法备注说明 public string Example { get; set; } //方法的示例 public Helper_API_Method_Attr[] Attrs { get; set; } //方法的特性 public Helper_API_Method_Para[] Paras { get; set; } //方法的参数 public Helper_API_Method_Return Return { get; set; } //返回值的类型 public string ClassName { get; set; } //方法所的类的名称 public string Class { get; set; } //方法所的类的完整名称 public static string GetHelp(XmlNode node, string txt) { string intro = string.Empty; if (node == null) return string.Empty; XmlNode n = node.SelectSingleNode(txt); if (n == null) return string.Empty; return n.InnerText.Trim(); } //方法的完整名,包括方法名+(参数) public static string GetFullName(MethodInfo mi) { string paras = Helper_API_Method_Para.GetParaString(mi); if (paras.Length < 1) return string.Format("{0}.{1}", mi.ReflectedType.FullName, mi.Name); return string.Format("{0}.{1}({2})", mi.ReflectedType.FullName, mi.Name, paras); } //获取方法的注释节点 public static XmlNode GetNode(MethodInfo mi, XmlNodeList nodes) { if (nodes == null) return null; XmlNode node = null; string fullname = GetFullName(mi); foreach (XmlNode n in nodes) { if (n.Attributes["name"].Value.EndsWith(fullname)) { node = n; break; } } return node; } } //方法的返回值 public class Helper_API_Method_Return { //返回值的类型 public string Type { get; set; } //返回值的摘要 public string Intro { get; set; } public static Helper_API_Method_Return GetReturn(MethodInfo method, XmlNode node) { Helper_API_Method_Return ret = new Helper_API_Method_Return(); if (node != null) { if (node.SelectSingleNode("returns") != null) ret.Intro = node.SelectSingleNode("returns").InnerText.Trim(); //返回值的摘要 } if (string.IsNullOrWhiteSpace(ret.Intro)) ret.Intro = string.Empty; ret.Type = method.ReturnParameter.ToString(); //返回类型 return ret; } } //方法的参数 public class Helper_API_Method_Para { public string Name { get; set; } //参数名称 public string Type { get; set; } //参数数据类型 public string Intro { get; set; } //参数的摘要 public static Helper_API_Method_Para[] GetParas(MethodInfo method) { ParameterInfo[] paramInfos = method.GetParameters(); Helper_API_Method_Para[] paras = new Helper_API_Method_Para[paramInfos.Length]; for (int i = 0; i < paramInfos.Length; i++) { ParameterInfo pi = paramInfos[i]; paras[i] = new Helper_API_Method_Para(); paras[i].Name = pi.Name; paras[i].Type = pi.ParameterType.FullName; } return paras; } public static Helper_API_Method_Para[] GetParas(MethodInfo method, XmlNode node) { Helper_API_Method_Para[] paras = GetParas(method); if (node == null) return paras; for (int i = 0; i < paras.Length; i++) { Helper_API_Method_Para pi = paras[i]; foreach (XmlNode n in node.SelectNodes("param")) { string name = n.Attributes["name"].Value; if (name.Equals(pi.Name, StringComparison.CurrentCultureIgnoreCase)) { pi.Intro = n.InnerText.Trim(); break; } } } return paras; } /// /// 获取参数的类型,多个参数串连 /// /// /// public static string GetParaString(MethodInfo method) { string str = string.Empty; ParameterInfo[] paras = method.GetParameters(); for (int i = 0; i < paras.Length; i++) { str += paras[i].ParameterType.FullName; if (i < paras.Length - 1) str += ","; } return str; } } //方法的特性 public class Helper_API_Method_Attr { public string Name { get; set; } //特性名称 public bool Ignore { get; set; } public int Expires { get; set; } //缓存的过期时效 public static Helper_API_Method_Attr[] GetAttrs(MethodInfo method) { //所有特性 Type[] attrs = WebAttribute.Initialization(); List list = new List(); foreach (Type att in attrs) { //取类上面的特性 object[] attrsObj = method.DeclaringType.GetCustomAttributes(att, true); for (int i = 0; i < attrsObj.Length; i++) { WeishaAttr attr = attrsObj[i] as WeishaAttr; if (list.Contains(attr)) { if (attr.Ignore) list[i].Ignore = true; } else { list.Add(attr); } } //取方法上的特性 object[] attrsMethod = method.GetCustomAttributes(att, true); for (int i = 0; i < attrsMethod.Length; i++) { WeishaAttr attr = attrsMethod[i] as WeishaAttr; if (list.Contains(attr)) { if (attr.Ignore) list[i].Ignore = true; } else { list.Add(attr); } } } //ignore为true的全部移除,不输出 for (int i = 0; i < list.Count; i++) { WeishaAttr attr = list[i] as WeishaAttr; if (attr == null) continue; if (attr.Ignore) list.RemoveAt(i); } //去除"Attribute"字样 Helper_API_Method_Attr[] arr = new Helper_API_Method_Attr[list.Count]; for (int i = 0; i < arr.Length; i++) { arr[i] = new Helper_API_Method_Attr(); arr[i].Name = list[i].GetType().Name.Replace("Attribute", ""); if (list[i] is WeishaAttr) arr[i].Ignore = ((WeishaAttr)list[i]).Ignore; if (list[i] is CacheAttribute) arr[i].Expires = ((CacheAttribute)list[i]).Expires; } return arr; } } #endregion }