前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >牛啊后续:如何一行C#代码实现解析类型的Summary注释(可用于数据字典快速生成)

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

作者头像
Wesky
发布2024-08-13 19:20:06
830
发布2024-08-13 19:20:06
举报
文章被收录于专栏:Dotnet Dancer

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

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

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

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

昨天的演示文章可参考:

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

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

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

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

运行一下看下效果:

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

解析部分核心代码:

代码语言:javascript
复制
  /// <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】

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版本环境,均可直接引用。

再次感谢各位阅读~~~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Dotnet Dancer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档