1分钟生成Net对象的注释
我们在开发过程中,肯定会有几个项目作为基础项目,存放一些比较常用的类和方法,供其他项目使用.一般来说,方法实现以后,就不想再去管它了,以致于新加入的某个伙计问这个项目里的方法有没注释或说明啊,一般的答案都是木有.之后的事情,大家就都知道了,不再描述了.
---------------------------------------------------------------------------------
博客搬家啦,新地址:
---------------------------------------------------------------------------------
其实生成项目里类或接口的注释,方法有很多,前几天还在园子里看到一篇使用Sandcastle软件生成DLL文件的CHM帮助文档,我目前也是使用这个软件生成API文档,地址没有找到.感兴趣的朋友可以去搜索下,本篇重点不是讲解这个软件如何使用.
下面说一下业务场景,根据客户的业务需求,需要在NET程序里,展示某个类库中类的属性或方法列表供客户查看,如图-1所示
图-1
使用反射方式,可以非常简单的生成如上图所示的结构,如果就这样拿过去给客户看的话,客户估计直接啥眼了,这些是什么东东呢?接着,经过你长时间耐心的教导和解释这些方法如何使用,最后终于功夫不负有心人啊,客户说:这个需求先不做了….额,不知道你是该高兴还是该悲催呢?
OK,业务场景有了,我们就要找到方法解决它?起初,我采用的方法是通过Net的Attribute自定义属性来实现的.简单说下思路,就是创建如图-2所示的这些类,并且这些类均继承自Attribute类
图-2
目前,这些类中,均定义了两个属性,DisplayText和Descrip,即各对象的中文显示名称和描述性文字,如图-3所示.这样我们就可以在反射获取类或方法的过程中,获取它的自定义属性信息,使用这种方式,解决了我们的大部分问题,可以说是基本可以实现的.不过,它需要对DLL文件中的每个类或方法加上我们刚刚创建好的自定义属性类,工作量也确实不小.而且,在描述方法的参数信息时,由于参数个数不确定性,导致自定义属性编辑比较麻烦.最终,这个方法Over掉,没有被采纳.
图-3
前几天忽然想起,我们可以将DLL中的类或方法的注释,直接生成XML文件,即在生成DLL的配置项中,勾选XML documention file这个选项即可,它就会生成这个DLL文件的XML注释文件.如图-4所示
图-4
我们现在来看看这个XML文件的格式,如图-5所示
图-5
解析这个XML文件,对于我们来说,简直是小儿科了,而且我们需要做的事情,就是补齐每个类或方法的注释信息,而不必额外再使用自定义属性来记录注释信息了.如果你之前有比较好的习惯,类或方法都有注释的话,那么恭喜你.你的任务已经完成了.解析方法如图-6所示,在我提供的文件中是完整的,大家可以直接下载.
图-6
看看我们解析的效果吧,如图-7所示.得到下面的数据后,在反射过程中,就可以在这里查找了,包括类名称,方法名称,还包括方法所需的参数名称,这里应有尽有啊.
代码片段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | /// <summary> /// 获取DLL文件类对象注释信息 /// </summary> /// <param name="xmlFileName"></param> /// <returns></returns> public static DataTable GetTableMemberComments( string xmlFileName) { DataTable tableComments = null ; //参数检测 if ( string .IsNullOrEmpty(xmlFileName)) return tableComments; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlFileName); int i = 0; tableComments = new DataTable(); tableComments.Columns.Add( "Name" , typeof ( string )); tableComments.Columns.Add( "Comments" , typeof ( string )); XmlNode xnMembers = xmlDoc.ChildNodes[1].ChildNodes[1]; foreach (XmlNode xnMember in xnMembers.ChildNodes) { //获取方法名称,去掉前缀,获取"("之前的字符串 string tempName = xnMember.Attributes[ "name" ].Value.Trim(); string memberName = tempName.Substring(2, tempName.Length - 2); string memberComments = xnMember.ChildNodes[0].InnerText.Trim(); tableComments.Rows.Add( new object [] { memberName, memberComments }); //获取方法参数,注:最后一个结点可能是返回值,需特殊处理 int count = xnMember.ChildNodes.Count; if (count >= 2) { string parameterName = string .Empty; string parameterComments = string .Empty; for ( int j = 1; j < count - 1; j++) { parameterName = xnMember.ChildNodes[j].Attributes[ "name" ].Value; parameterComments = xnMember.ChildNodes[j].InnerText; tableComments.Rows.Add( new object [] { memberName + "." + parameterName, parameterComments }); } //处理最后一个结点 XmlNode xnLast = xnMember.ChildNodes[count - 1]; //根据结点名称判断 string xmlName = xnLast.Name.Trim().ToLower(); parameterComments = xnLast.InnerText; if (xmlName == "returns" ) { parameterName = "Returns" ; } else { parameterName = xnLast.Attributes[ "name" ].Value; } tableComments.Rows.Add( new object [] { memberName + "." + parameterName, parameterComments }); } i++; } return tableComments; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库