我有一个属性很少的类,其中一些有XML注释(摘要)。 我想要做的是在应用程序中显示用户的摘要信息。 所以我需要在代码中访问摘要文本,以便能够做到:Label1.Text = ....... 我该怎么做?
public class MyObject
{
public int ID { get; set; }
/// <summary>
/// very very very very extensive information about the city
/// </summary>
public string City { get; set; }
public DateTime Date { get; set; }
public int Value { get; set; }
public int DiffToPrev { get; set; }
}
class Program
{
static void Main()
{
var a = new MyObject();
var t = a.GetType().GetProperty("City");
Console.WriteLine(t....................
答案 0 :(得分:6)
请注意,XML注释不包含在生成的exe / dll文件中,因此您需要启用xml文件生成并分发它们。 Consder使用属性为您的属性/方法/类/等提供运行时可用信息,因为XML注释可能不是为您要执行的操作而设计的。
无论如何,XML注释的格式如下:
<?xml version="1.0"?>
<doc>
<assembly>
<name><!-- assembly name here --></name>
</assembly>
<members>
<!-- ... -->
<member name="M:Full.Type.Name.PropertyName">
<summary>
<!-- property summary here -->
</summary>
</member>
<!-- ... -->
</memebers>
</doc>
因此,如果您仍然需要它,则需要加载XML注释文件并查找XML节点,描述您的属性(未经测试的代码,只是为了显示方法):
var a = new MyObject();
var t = a.GetType().GetProperty("City");
string xmlMemberName = "M:" + a.FullName + t.Name;
var xmlDoc = new XmlDocument();
xmlDoc.Load("you_xml_comments_file.xml");
var membersNode = xmlDoc.DocumentElement["members"];
string summary = "";
if(membersNode != null)
{
foreach(XmlNode memberNode in membersNode.ChildNodes)
{
if(memberNode.Attributes["name"].Value == xmlMemberName)
{
summary = memberNode["summary"].InnerText;
break;
}
}
}
Console.WriteLine(summary);
更新:您还可以将XML注释文件包含为嵌入式资源,这样您就永远不会忘记分发它,甚至编写一个小工具,将XML注释文件转换为.resx XML资源文件。
将XML评论文件作为嵌入资源包含在内:
现在,您的xml注释作为资源包含在程序集文件中,可以通过以下方式加载:
XmlDocument doc;
using(var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(
"your_default_namespace" + "." + "your_xml_file_name.xml"))
{
doc.Load(stream);
}
从评论XML文件生成.resx:
.resx格式:
<root>
<!-- some header stuff which can be copy-pasted from any other valid .resx -->
<!-- ... -->
<data name="Your_Object_Full_Name_PropertyName" xml:space="preserve">
<value><!-- summary here --></value>
</data>
<!-- ... -->
</root>
可以使用ResourceManager
类从此.resx加载字符串。
答案 1 :(得分:2)
尽管max提供了一个非常全面的答案,我只是想我会添加一篇关于这个问题编写的博客文章。我提供了一个使用MemberInfo
上的扩展方法来读取XML注释的解决方案。我的实现使用XDocument
和XPath查询来返回文本。它适用于方法,属性,类型,事件,字段和方法参数。
答案 2 :(得分:1)
您可以检查项目选项中的标志以生成XML文档。
您可以使用常用的XML工具解析生成的文件。
根据用例属性可能更适合。但在你的情况下,似乎会导致无用的冗余。
但两者在本地化方面都有点问题。您通常希望不在源中的可本地化字符串,但在单独的文件中。
答案 3 :(得分:0)
这是不可能的,因为评论不会被编译
答案 4 :(得分:0)