代码之家  ›  专栏  ›  技术社区  ›  Marty

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

  •  1
  • Marty  · 技术社区  · 15 年前

    我有一个类,属性很少,其中一些具有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 回复  |  直到 15 年前
        1
  •  2
  •   Bradley Smith    15 年前

    尽管马克斯提供了一个非常全面的答案,我只是想我会添加一篇关于这个问题的博客文章。我提供的解决方案使用扩展方法 MemberInfo 读取XML注释。我的实现使用 XDocument 以及返回文本的XPath查询。它处理方法、属性、类型、事件、字段和方法参数。

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

        2
  •  6
  •   max    15 年前

    请注意,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. 编译项目
    3. 在Project Explorer中启用“显示所有文件”和内部生成的XML文件
    4. 打开文件属性并将生成操作设置为“嵌入资源”

    现在,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>
    

    可以使用从该.resx加载字符串 ResourceManager 班级。

        3
  •  1
  •   CodesInChaos    15 年前

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

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

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

    但这两者都有点局限性问题。您通常希望可本地化的字符串不在源文件中,而是在单独的文件中。

        4
  •  0
  •   Ali Tarhini    15 年前

    这是不可能的,因为注释不会被编译

        5
  •  0
  •   Eilistraee    15 年前

    无法访问代码中的XML注释信息。如前所述,这些都是注释,不由编译器处理。

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

    如果要注释属性,请使用如下属性 one 包含在MVC框架中

    推荐文章