牛啊后续:如何一行C#代码实现解析类型的Summary注释(可用于数据字典快速生成)...

news2024/11/22 23:15:10

前言:下午有小伙伴要求,让我继续做个解析实体类注释信息的内容。所以我也顺便加入进来。以下开始正文实战操作:

项目需要勾选输出api文档文件。这样就可以让所有实体类的summary信息被写入到输出目录下。如果有多个xml文件也没关系,下面的包已经实现自动解析多个xml文件功能,只选取匹配的那个。

3ffb9f5d3476db6f11f7243c81780a8e.png

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

c7f262cf8bccc6298328662279c03919.png

为了方便,我直接在昨天的演示基础上,继续给实体类添加注释。

昨天的演示文章可参考:

C#/.NET一行代码把实体类类型转换为Json数据字符串

https://mp.weixin.qq.com/s/nVcURD0lf5-AQOVzwHqcxw

对实体类添加注释,该实体类嵌套一层集合属性。

fab8e2fe68a6009a55b152cad36e60be.png

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

29c28bbbf4138fbcbb11e6f38ca5dbae.png

运行一下看下效果:

553ad40910cfb499a0a40b58f5f56dee.png

以上只是简单演示,你也可以用来快速生成实体类说明文档。例如:通过反射,获取所有类型,然后进行代入,解析出每个类型里面的属性以及注释,直接就是你的一个实体说明文档了

解析部分核心代码:

/// <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;
  }

如果以上内容对你有帮助,欢迎点赞、留言、在看、转发,也欢迎关注我的个人公众号:【Dotnet Dancer】

快捷关注:

1c96efdeb12c62f1eeee474bf858abe5.jpeg

OpenTools系列文章快捷链接【新版本完全兼容旧版本,不需要更新任何代码均可使用】:

1.0.10版本:

C#/.NET一行代码把实体类类型转换为Json数据字符串

https://mp.weixin.qq.com/s/nVcURD0lf5-AQOVzwHqcxw

1.0.8版本:

上位机和工控必备!用.NET快速搞定Modbus通信的方法

https://mp.weixin.qq.com/s/Yq6kuXzFglHfNUqrHcQO9w

1.0.7版本:

大揭秘!.Net如何在5分钟内快速实现物联网扫码器通用扫码功能?

https://mp.weixin.qq.com/s/-5VuLAS6HlElgDQXRY9-BQ

1.0.6版本:

.NET实现获取NTP服务器时间并同步(附带Windows系统启用NTP服务功能)

https://mp.weixin.qq.com/s/vMW0vYC-D9z0Dp6HFSBqyg

1.0.5版本:

C#使用P/Invoke来实现注册表的增删改查功能

https://mp.weixin.qq.com/s/LpsjBhDDzkwyLU_tIpF-lg

1.0.3版本:

C#实现图片转Base64字符串,以及base64字符串在Markdown文件内复原的演示

https://mp.weixin.qq.com/s/n9VtTCIiVUbHJk7OfoCcvA

1.0.2版本:

C#实现Ping远程主机功能(支持IP和域名)

https://mp.weixin.qq.com/s/d-2HcIM1KaLo-FrrTLkwEw

1.0.1版本:

开始开源项目OpenTools的创作(第一个功能:AES加密解密)

https://mp.weixin.qq.com/s/78TA-m‍st‍459AuvAHwQViqQ

【备注】包版本完全开源,并且没有任何第三方依赖。使用.net framework 4.6+、任意其他跨平台.net版本环境,均可直接引用。

再次感谢各位阅读~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1798080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大厂AI团战高考作文,华师一附中特级教师这样打分

在人工智能的浪潮中&#xff0c; 人们不禁疑问&#xff1a; AI真的能超越人类吗&#xff1f; 这究竟是现实还是幻想&#xff1f; 我们将目睹一场前所未有的较量&#xff1a; 百度文心一言、阿里通义千问、 腾讯混元、字节豆包 四家国内顶尖互联网企业 精心打造的AI大模…

AI大模型:引领产业变革的新引擎

前言 随着ChatGPT的火爆出圈&#xff0c;AI人工智能的时代浪潮似乎真的已经来临。人们开始感受到AI技术的实际影响&#xff0c;并纷纷思考这一技术将如何重塑我们的世界。在国内&#xff0c;各大科技巨头已经纷纷布局AI大模型领域&#xff0c;意图在这一轮技术变革中抢占先机。…

【画板案例-画线 Objective-C语言】

一、接下来,我们来做这个画线的功能, 1.我们要在这个灰色的View上,去画线, 首先,我要用到的东西,一定是touchesBegan:touchesMoved: 这是一定要有的, 然后呢,我还要去画线,所以,也要用到drawRect: 这三个方法,是我一定要有的,我要去写代码,所以,要给它绑定…

生成纳秒级别的时间戳

问题 同步influxdb有些数据没有&#xff0c;不知道啥原因&#xff0c;后来百度发现时间需要唯一&#xff0c;毫秒还会重复&#xff0c;只能采用纳秒处理了 java实现 TimeStampUtils.java package com.wujialiang;/*** 获取纳秒值的工具类*/ public class TimeStampUtils {/…

使Obsidian 导出pdf含书签的解决方案

使用Better Export PDF第三方插件 GitHub - l1xnan/obsidian-better-export-pdf: Obsidian PDF export enhancement plugin 正确安装并开启后&#xff0c;在右侧栏中选择Better Export PDF导出 最后效果如下。 值得注意的是Better Export PDF插件与floating toc插件不兼容。

Python opencv读取深度图,网格化显示深度

效果图&#xff1a; 代码&#xff1a; import cv2 import osimg_path "./outdir/180m_norm_depth.png" depth_img cv2.imread(img_path, cv2.IMREAD_ANYDEPTH) filename os.path.basename(img_path) img_hig, img_wid depth_img.shape # (1080, 1920) print(de…

HQL面试题练习 —— 占据好友封面个数

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;腾讯。 1 题目 有两个表&#xff0c;朋友关系表user_friend&#xff0c;用户步数表user_steps。朋友关系表包含两个字段&#xff0c;用户id&#xff0c;用户好友的id&#xff1b;用户步数表包含两个字段&#xff0c;用户id&am…

Windows 系统安装 VisualSVN Server

一.下载 VisualSVN Server VisualSVN-Server 是 SVN 版本控制中服务器端要使用的软件,就是我们提交代码存在安装这个软件的电脑上,它将很多配置和服务直接帮你完成,简单好用容易上手。VisualSVN Server有三个版本,社区版免费但限15个用户,另有一般和‘企业’两个收费版本…

打包idea代码至集群上运行

执行前记得在对应的节点上启动hdfs&#xff08;start-dfs.sh &#xff09;、yarn&#xff08;start-yarn.sh&#xff09;和任务历史服务&#xff08;mapred --daemon start historyserver&#xff09; 一、打包操作 1、在pom.xml中下载打包插件 直接将pom.xml里面的build删掉…

Python 和 Java 实现云计算的最终年项目

1、问题背景 目前&#xff0c;我正在进行我的最终年项目&#xff0c;计划用 Python 编写一个云计算系统&#xff0c;而云客户端将由我的团队成员使用 Java 来编写。这个云客户端将具有一个带有标签的界面&#xff0c;并提供文本编辑器、媒体播放器、几个基于 Java 的小游戏以及…

组件的注册和引用

在Vue中&#xff0c;开发者可以将页面中独立的、可重用的部分封装成组件&#xff0c;对组件的结构&#xff0c;样式和行为进行设置。组件是 Vue 的基本结构单元&#xff0c;组件之间可以相互引用。 一.注册组件 当在Vue项目中定义了一个新的组件后&#xff0c;要想在其他组件中…

交互式流程图组件DHTMLX Diagram v6.0 - 拥有更灵活的高度可定制功能

DHTMLX Diagram库允许用几行代码构建JavaScript流程图&#xff0c;通过自动布局和实时编辑器&#xff0c;它可以更容易地将复杂数据可视化到一个整洁的层次结构中。 DHTMLX Diagram v6.0版本发布&#xff0c;带来了众多令人兴奋的新功能和改进&#xff0c;使得这个JavaScript图…

App UI 风格,尽显魅力

精妙无比的App UI 风格

摄影店展示服务预约小程序的作用是什么

摄影店包含婚照、毕业照、写真、儿童照、工作照等多个服务项目&#xff0c;虽然如今人们手机打开便可随时拍照摄影&#xff0c;但在专业程度和场景应用方面&#xff0c;却是需要前往专业门店服务获取。 除了进店&#xff0c;也有外部预约及活动、同行合作等场景&#xff0c;重…

ROS socketcan_bridge使用说明

ROS socketcan_bridge使用说明&#xff08;以ubuntu20.04为例&#xff09; socketcan_bridge是什么 ROS针对socketcan提供了三个层次的驱动库&#xff0c;分别是ros_canopen&#xff0c;socketcan_bridge和socketcan_interface。 socketcan_interface&#xff1a; 功能&#x…

Docker:技术架构演进

文章目录 基本概念架构演进单机架构应用数据分离架构应用服务集群架构读写分离/主从分离架构冷热分离架构垂直分库微服务容器编排架构 本篇开始进行对于Docker的学习&#xff0c;Docker是一个陌生的词汇&#xff0c;那么本篇开始就先从技术架构的角度出发&#xff0c;先对于技术…

python词云生成库-wordcloud

内容目录 一、模块介绍二、WordCloud常用的方法1. generate(self, text)2. generate_from_frequencies(frequencies)3. fit_words(frequencies)4. generate_from_text(text) 三、进阶技巧1. 设置蒙版2. 设置过滤词 WordCloud 是一个用于生成词云的 Python 库&#xff0c;它可以…

6-Maven的使用

6-Maven的使用 常用maven命令 //常用maven命令 mvn -v //查看版本 mvn archetype:create //创建 Maven 项目 mvn compile //编译源代码 mvn test-compile //编译测试代码 mvn test //运行应用程序中的单元测试 mvn site //生成项目相关信息的网站 mvn package //依据项目生成 …

问题:卫生事业的发展受多种因素的影响和制约,以下属于卫生事业发展影响因素的有(? ?)。 #微信#其他

问题&#xff1a;卫生事业的发展受多种因素的影响和制约&#xff0c;以下属于卫生事业发展影响因素的有&#xff08;? ?&#xff09;。 A、经济水平 B、管理水平 C、人口素质 D、科技发展 参考答案如图所示

全面解析:渗压计数据如何预测地下水趋势

随着人们对水资源日益增长的需求和对环境保护意识的提升&#xff0c;地下水位的监测和预测成为了水利工程和环境科学领域的重要研究内容。渗压计作为一种能够测量土壤或岩石中孔隙水压力的仪器&#xff0c;在地下水位的监测中发挥着关键作用。本文将从渗压计的工作原理、安装方…