使用Wesky.Net.Opentools库,一行代码实现自动解析实体类summary注释信息(可用于数据实体文档的快速实现)

wesky,net,opentools,summary · 浏览次数 : 0

小编点评

**使用前,务必勾选输出API文档文件。** 在使用 Wesky.Net.OpenTools 包之前,请确保您的项目已经勾选了输出 API 文档文件的选项,并且 Wesky.Net.OpenTools 的版本应保持在 1.0.11 或更高版本。 以下是基于上一个演示内容的实体类添加注释的示例,这些注释可以帮助您快速了解实体类中的属性及其描述: ```csharp // 示例实体类:Student public class Student { // 学生ID,作为唯一标识(Required) [Key] public int StudentID { get; set; } // 姓名(Required) public string Name { get; set; } // 年龄(Required) public int Age { get; set; } // 班级(Required) public string Grade { get; set; } // 家庭地址(Optional) public string Address { get; set; } // 爱好(Optional) public string Hobbies { get; set; } // 其他属性... } ``` 要使用 Wesky.Net.OpenTools 为这个实体类生成文档,您可以按照以下步骤操作: 1. 在您的 C# 项目中引入 Wesky.Net.OpenTools。 2. 调用 `GenerateEntitySummaries` 方法来获取实体类的所有属性摘要信息。 以下是一个简化的示例代码: ```csharp using Wesky.Net.OpenTools; // ... var studentType = typeof(Student); var summaries = GenerateEntitySummaries(studentType); foreach (var summary in summaries) { Console.WriteLine($"\t{summary.Name} (Type: {summary.TypeName}): {summary.Summary}"); } ``` 这将输出实体类 `Student` 的所有属性及其描述到一个控制台。 **注意事项:** - 请确保项目中已安装 Wesky.Net.OpenTools。 - 使用此方法时,请确保您的应用程序符合 API 文档中的要求。 - 由于这是一个简化的示例,实际应用中可能需要根据您的具体需求调整代码。

正文

使用前,需要对你的项目勾选输出api文档文件。
0
引用Wesky.Net.OpenTools包,保持1.0.11版本或以上。
0
 
为了方便,我直接在昨天的演示基础上,继续给实体类添加注释。
昨天的演示文章可参考:
C#/.NET一行代码把实体类类型转换为Json数据字符串
对实体类添加注释:
0
然后传入实体类型,即可获取到类型数据集合:
0
运行一下看下效果:
0
以上只是简单演示,你也可以用来快速生成实体类说明文档。例如通过反射,获取所有类型,然后进行代入,解析出每个类型里面的属性以及注释,直接就是你的一个演示文档了。
解析部分核心代码:
 
  /// <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.Net.Opentools库,一行代码实现自动解析实体类summary注释信息(可用于数据实体文档的快速实现)相似的内容:

使用Wesky.Net.Opentools库,一行代码实现自动解析实体类summary注释信息(可用于数据实体文档的快速实现)

使用前,需要对你的项目勾选输出api文档文件。 引用Wesky.Net.OpenTools包,保持1.0.11版本或以上。 为了方便,我直接在昨天的演示基础上,继续给实体类添加注释。 昨天的演示文章可参考: C#/.NET一行代码把实体类类型转换为Json数据字符串 https://mp.weixi

使用Wesky.Net.Opentools库,一行代码实现实体类类型转换为Json格式字符串

安装1.0.10以及以上版本的 Wesky.Net.OpenTools 包 包内,该功能的核心代码如下: 自定义属性: 实体类JSON模式生成器: 使用方式:引用上面的1.0.10版本或以上的包。如果实体类有特殊需求,例如映射为其他名称,可以用OpenJson属性来实现。实体类对象案例如下: 上面实

.NET使用P/Invoke来实现注册表的增、删、改、查功能

注册表可以用来进行存储一些程序的信息,例如用户的权限、或者某些值等,可以根据个人需要进行存储和删减。 当前注册表主目录: 引用包 Wesky.Net.OpenTools 1.0.5或者以上版本 操作演示: 创建注册表项 设置注册表值 读取注册表值 删除注册表值 删除注册表项 操作演示代码 IRegi

使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能

今天遇到有人提到结构体和byte数组互转的问题,我就顺便拿来水一篇。这是一个冷门的问题,估计使用的人不多。既然有需求,应该就有使用场景,那就顺便整一波。 为了达到效果,结构体、复杂结构体嵌套等都能实现转换,我就顺便做了个包更新来提供使用和下面的说明。 首先引入nuget包 Wesky.Net.Ope

上位机开发福利!快速掌握.NET中的Modbus通信

安装nuget包 Wesky.Net.OpenTools 1.0.8或以上版本。支持.net framework 4.6以上版本,以及所有.net core以及以上版本引用。 开发一个简单的Winform界面,用来测试使用。如需该winform的demo,可以在公众号【Dotnet Dancer】后

Python使用.NET开发的类库来提高你的程序执行效率

Python由于本身的特性原因,执行程序期间可能效率并不是很理想。在某些需要自己提高一些代码的执行效率的时候,可以考虑使用C#、C++、Rust等语言开发的库来提高python本身的执行效率。接下来,我演示一种使用.NET平台开发的类库,来演示一下Python访问.NET类库的操作实现。类库演示包括

WPF使用事件聚合器,实现任意页面跨页通信

前言:最近几天有好几个小伙伴玩WPF,遇到不同页面,不知道要怎么传递消息。于是,我今天就来演示一个事件聚合器的玩法,采用prism框架来实现。作为福利,内容附带了主页面打开对话框时候直接通过参数传递消息的一个小例子,具体请自行围观。 以下内容,创建wpf项目以及引用prism和实现依赖注入等细节,可

谁说.net core不好动态访问webservice?看这篇文章,C#快速实现动态访问webservice,兼容.net framework和.net core+

前言:访问webservice,大多数人都是用服务引用的方式,但是这种方式比较麻烦,例如遇到服务更新了,你还需要手动更新你的服务引用,再重新发布,很麻烦。或者已有的一些例子,至少我看到的很多案例,动态访问也只能止步于使用.net framework环境,没看到有啥.net core上面动态访问的案例

一款WPF的精简版MVVM框架——stylet框架的初体验(包括MVVM绑定、依赖注入等操作)

今天偶然知道一款叫做stylet的MVVM框架,挺小巧的,特别是它的命令触发方式,简单粗暴,让人感觉很巴适,现在我做一个简单的demo来顺便来分享给大家。 本地创建一个WPF项目,此处我使用.NET 8来创建。然后引用stylet最新的nuget包。 然后删掉App.xaml里面自带的启动项 删掉以

使用EF 连接 数据库 SQLserver、MySql 实现 CodeFirst

1.新建项目,下载Nuget安装包 创建项目需要注意几点,如果是基于 .net framework 的项目 需要选择 相应版本的 EF, 如果是跨平台则选择EF Core版本。 我这里选择的是 .net framework 版本。红框里面是 实现EF Code First 需要的包。 对应的版本: