如何在代码中访问属性摘要?

时间:2010-11-24 13:51:48

标签: c# .net

我有一个属性很少的类,其中一些有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....................

5 个答案:

答案 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评论文件作为嵌入资源包含在内:

  1. 在项目属性中启用XML文件生成
  2. 将XML输出文件路径设置为项目目录(而不是bin / Release或bin / Debug)
  3. 编译项​​目
  4. 项目资源管理器中的
  5. 启用“显示所有文件”并输入生成的xml文件
  6. 打开文件属性并将构建操作设置为“嵌入式资源”
  7. 现在,您的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查询来返回文本。它适用于方法,属性,类型,事件,字段和方法参数。

见这里:http://www.brad-smith.info/blog/archives/220

答案 2 :(得分:1)

您可以检查项目选项中的标志以生成XML文档。

您可以使用常用的XML工具解析生成的文件。

根据用例属性可能更适合。但在你的情况下,似乎会导致无用的冗余。

但两者在本地化方面都有点问题。您通常希望不在源中的可本地化字符串,但在单独的文件中。

答案 3 :(得分:0)

这是不可能的,因为评论不会被编译

答案 4 :(得分:0)

您无法在代码中访问XML注释信息。如上所述,这些是评论,并不由编译器处理。

但是,它们可用于生成自动文档。

如果要注释属性,请使用MVC框架中包含的one之类的属性