You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行时读取类及属性的summary注释文本?

运行时读取类与属性的Summary注释实现方案

问题描述

我希望在运行时读取类的summary注释文本,示例代码如下:

/// <summary>
/// Text I want to get 1
/// </summary>

class Hello
{
   /// <summary>
   /// Text I want to get 2
   /// </summary>
   string name {get;set;}
}
static void Main(string[] args)
{
}

请问是否可以实现?我期望得到一个包含类或属性名称及其对应summary注释的Dictionary结构,示例如下:

Dictionary<string, string> Dic ; 

例如:{("Hello", "Text I want to get 1"),("name", "Text I want to get 2")}

实现方案

可以实现,核心思路是利用反射获取类型与成员信息,再读取项目生成的XML文档注释文件匹配对应summary内容。具体步骤如下:

1. 开启XML文档生成

在项目属性的「生成」选项卡中,勾选「XML文档文件」,指定输出路径(默认生成与程序集同名的.xml文件)。若为.NET Core/.NET 5+项目,也可直接在.csproj文件中添加配置:

<GenerateDocumentationFile>true</GenerateDocumentationFile>

2. 编写读取逻辑

通过System.Reflection获取类型和成员,结合System.Xml.Linq.XDocument解析XML文档,提取目标summary文本。示例代码:

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Xml.Linq;
using System.Xml.XPath;

namespace CommentReader
{
    /// <summary>
    /// Text I want to get 1
    /// </summary>
    class Hello
    {
        /// <summary>
        /// Text I want to get 2
        /// </summary>
        public string Name { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var commentDict = new Dictionary<string, string>();
            var assembly = Assembly.GetExecutingAssembly();
            // 获取XML文档路径(与程序集同目录、同名)
            var xmlPath = assembly.Location.Replace(".exe", ".xml");
            var xDoc = XDocument.Load(xmlPath);
            var xmlNs = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");

            // 读取类的summary
            var helloType = typeof(Hello);
            var classXPath = $"//member[@name='T:{helloType.FullName}']";
            var classSummary = xDoc.XPathSelectElement(classXPath)?
                .Element(xmlNs + "summary")?.Value.Trim();
            if (!string.IsNullOrEmpty(classSummary))
            {
                commentDict.Add(helloType.Name, classSummary);
            }

            // 读取属性的summary
            foreach (var prop in helloType.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                var propXPath = $"//member[@name='P:{helloType.FullName}.{prop.Name}']";
                var propSummary = xDoc.XPathSelectElement(propXPath)?
                    .Element(xmlNs + "summary")?.Value.Trim();
                if (!string.IsNullOrEmpty(propSummary))
                {
                    commentDict.Add(prop.Name, propSummary);
                }
            }

            // 输出结果
            foreach (var kvp in commentDict)
            {
                Console.WriteLine($"[{kvp.Key}]: {kvp.Value}");
            }
        }
    }
}

3. 关键注意事项

  • 确保XML文档文件与程序集处于同一目录,否则需调整路径读取逻辑。
  • XML中member节点的name属性格式需严格匹配:类为T:命名空间.类名,属性为P:命名空间.类名.属性名,方法为M:命名空间.类名.方法名(参数类型)。
  • 若成员存在重载,需在XPath中精确匹配参数类型以避免混淆。

内容的提问来源于stack exchange,提问作者MadaraUtchi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:22:16