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

Mar*_*rty 1 .net c#

我有一个类,具有很少的属性,其中一些有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....................
Run Code Online (Sandbox Code Playgroud)

max*_*max 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>
Run Code Online (Sandbox Code Playgroud)

因此,如果您仍然需要它,则需要加载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);
Run Code Online (Sandbox Code Playgroud)

更新:您还可以将XML注释文件作为嵌入式资源包含在内,这样您就永远不会忘记分发它,甚至编写一个小工具,将XML注释文件转换为.resx XML资源文件.

将XML注释文件作为嵌入资源包含:

  1. 在项目属性中启用XML文件生成
  2. 将XML输出文件路径设置为项目目录(而不是bin/Release或bin/Debug)
  3. 编译项目
  4. 在项目资源管理器中启用"显示所有文件"并包含生成的xml文件
  5. 打开文件属性并将构建操作设置为"嵌入式资源"

现在您的xml注释作为资源包含在程序集文件中,可以通过以下方式加载:

XmlDocument doc;
using(var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(
    "your_default_namespace" + "." + "your_xml_file_name.xml"))
{
    doc.Load(stream);
}
Run Code Online (Sandbox Code Playgroud)

要从注释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>
Run Code Online (Sandbox Code Playgroud)

可以使用ResourceManager类从此.resx加载字符串.