使用Wesky.Net.Opentools库,一行代码实现自动解析实体类summary注释信息(可用于数据实体文档的快速实现)
1..NET使用P/Invoke来实现注册表的增、删、改、查功能2..NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)3.工业福利!用.NET快速开发物联网扫码器设备的通用扫码功能4.上位机开发福利!快速掌握.NET中的Modbus通信5.使用Wesky.Net.Opentools库,一行代码实现实体类类型转换为Json格式字符串
6.使用Wesky.Net.Opentools库,一行代码实现自动解析实体类summary注释信息(可用于数据实体文档的快速实现)
7.谁说.net core不好动态访问webservice?看这篇文章,C#快速实现动态访问webservice,兼容.net framework和.net core+8.使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能9.基于DPAPI+RDP技术实现本地打开远程程序,并映射到本地机器桌面上使用前,需要对你的项目勾选输出api文档文件。

引用Wesky.Net.OpenTools包,保持1.0.11版本或以上。

为了方便,我直接在昨天的演示基础上,继续给实体类添加注释。
昨天的演示文章可参考:
C#/.NET一行代码把实体类类型转换为Json数据字符串
对实体类添加注释:

然后传入实体类型,即可获取到类型数据集合:

运行一下看下效果:

以上只是简单演示,你也可以用来快速生成实体类说明文档。例如通过反射,获取所有类型,然后进行代入,解析出每个类型里面的属性以及注释,直接就是你的一个演示文档了。
解析部分核心代码:
/// <summary> /// 生成给定类型的所有属性的摘要信息列表,搜索所有相关XML文档。 /// Generates a list of summary information for all properties of a given type, searching through all relevant XML documents. /// </summary> /// <param name="type">要分析的类型。The type to analyze.</param> /// <param name="parentPrefix">处理属性路径时用于嵌套属性的前缀。Prefix for nested properties to handle property paths correctly.</param> /// <returns>摘要信息实体列表。A list of summary information entities.</returns> public static List<DynamicSumaryInfo> GenerateEntitySummaries(Type type, string parentPrefix = "") { var summaryInfos = new List<DynamicSumaryInfo>(); IEnumerable<string> xmlPaths = GetAllXmlDocumentationPaths(); foreach (string xmlPath in xmlPaths) { if (File.Exists(xmlPath)) { XDocument xmlDoc = XDocument.Load(xmlPath); XElement root = xmlDoc.Root; summaryInfos.AddRange(ExtractSummaryInfo(type, root, parentPrefix)); } } return summaryInfos; } /// <summary> /// 获取当前执行环境目录下所有XML文档的路径。 /// Retrieves the paths to all XML documentation files in the current execution environment directory. /// </summary> /// <returns>所有XML文档文件的路径列表。A list of paths to all XML documentation files.</returns> private static IEnumerable<string> GetAllXmlDocumentationPaths() { string basePath = AppContext.BaseDirectory; return Directory.GetFiles(basePath, "*.xml", SearchOption.TopDirectoryOnly); } /// <summary> /// 从XML文档中提取指定类型的所有属性的摘要信息。 /// Extracts summary information for all properties of a specified type from an XML document. /// </summary> /// <param name="type">属性所属的类型。The type to which the properties belong.</param> /// <param name="root">XML文档的根元素。The root element of the XML document.</param> /// <param name="parentPrefix">属性的前缀路径。The prefix path for properties.</param> /// <returns>摘要信息实体列表。A list of summary information entities.</returns> private static List<DynamicSumaryInfo> ExtractSummaryInfo(Type type, XElement root, string parentPrefix) { var infos = new List<DynamicSumaryInfo>(); foreach (PropertyInfo property in type.GetProperties()) { string fullPath = string.IsNullOrEmpty(parentPrefix) ? property.Name : $"{parentPrefix}.{property.Name}"; string typeName = property.PropertyType.Name; if (property.PropertyType.IsClass && property.PropertyType != typeof(string)) { Type propertyType = property.PropertyType; if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof(List<>)) { propertyType = propertyType.GetGenericArguments()[0]; typeName = $"List<{propertyType.Name}>"; } infos.AddRange(GenerateEntitySummaries(propertyType, fullPath)); } else { string summary = GetPropertySummary(root, type, property); infos.Add(new DynamicSumaryInfo { Name = fullPath, TypeName = typeName, Summary = summary ?? string.Empty }); } } return infos; }
OpenTools系列文章快捷链接【新版本完全兼容旧版本,不需要更新任何代码均可使用】:
1.0.10版本:
C#/.NET一行代码把实体类类型转换为Json数据字符串
1.0.8版本:
上位机和工控必备!用.NET快速搞定Modbus通信的方法
1.0.7版本:
大揭秘!.Net如何在5分钟内快速实现物联网扫码器通用扫码功能?
1.0.6版本:
.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)
1.0.5版本:
C#使用P/Invoke来实现注册表的增删改查功能
1.0.3版本:
C#实现图片转Base64字符串,以及base64字符串在Markdown文件内复原的演示
1.0.2版本:
C#实现Ping远程主机功能(支持IP和域名)
1.0.1版本:
开始开源项目OpenTools的创作(第一个功能:AES加密解密)
【备注】包版本完全开源,并且没有任何第三方依赖。使用.net framework 4.6+、任意其他跨平台.net版本环境,均可直接引用。
再次感谢各位阅读~~~
本文作者:Wesky
微信号:WeskyNet001
公众号:Dotnet Dancer
文章链接:https://www.cnblogs.com/weskynet/p/18236082

欢迎扫一扫关注公众号,发现更多其他技术分享
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
2021-06-06 十三、.net core(.NET 6)搭建ElasticSearch(ES)系列之dotnet操作ElasticSearch进行存取的方法
2021-06-06 十二、.net core(.NET 6)添加通用的访问webapi的方法(包括HttpClient和HttpWebRequest)