使用Wesky.Net.Opentools庫,一行程式碼實現自動解析實體類summary註釋資訊(可用於資料實體文件的快速實現)

WeskyNet發表於2024-06-06
使用前,需要對你的專案勾選輸出api文件檔案。
0
引用Wesky.Net.OpenTools包,保持1.0.11版本或以上。
0
為了方便,我直接在昨天的演示基礎上,繼續給實體類新增註釋。
昨天的演示文章可參考:
C#/.NET一行程式碼把實體類型別轉換為Json資料字串
https://mp.weixin.qq.com/s/nVcURD0lf5-AQOVzwHqcxw
對實體類新增註釋:
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資料字串
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版本環境,均可直接引用。
再次感謝各位閱讀~~~

相關文章