如何在运行时读取类及属性的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
相关产品推荐
相关产品推荐

