c#获取接口方法注释

18 c# reflection

说我有

    interface IFoo
    {
        /// <summary>
        /// Comments about Bar method goes here.
        /// </summary>
        void Bar();
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用反射在运行时显示方法

MethodInfo[] mis = typeof(IFoo).GetMethods();
Run Code Online (Sandbox Code Playgroud)

但我想知道我是否可以获得<summary> </summary>方法中包含的评论.我意识到注释只是忽略了我的编译器,但有什么可以做的来检索注释吗?现在我有一个单独的文件,其中包含方法和注释,但我讨厌冗余,并且想知道是否有任何方法可以执行此操作.

谢谢,

Joh*_*n K 15

C#编译器csc.exe有一个/ doc选项,用于输出具有三次斜杠注释的外部XML文件.文档生成器使用此XML文件(例如Sandcastle就是这样做的).

Visual Studio提供了导出XML注释的相同选项.要在Visual Studio开发环境中设置此编译器选项:

  1. 打开项目的"属性"页面.有关详细信息,请参见如何:设置项目属性(C#,J#).
  2. 单击Build属性页面.
  3. 修改XML Documentation File属性.

您可以使用.NET框架中的XML解析器加载此XML文件,访问其中的Types,并从中获取相关的注释.

你是对的,C#编译器不会将注释编译到元数据中.但是,Microsoft为导出功能创建了三重斜杠注释,因此您可以获得它们的句柄.

有关处理XML文件的说明,请参见MSDN.


例如,我启用了XML输出文件选项并记录了以下方法:

/// <summary>
/// This method parses the given name for
/// capitalization.
/// </summary>
public void ParseStringCase(string name)
{
    // behaviour of method...
}
Run Code Online (Sandbox Code Playgroud)

它在bin /文件夹中的文件中生成以下XML ....

<?xml version="1.0"?>
<doc>
    <assembly>
        <name>WindowsFormsApplication3</name>
    </assembly>
    <members>
        <member name="M:WindowsFormsApplication3.Form1.ParseStringCase(System.String)">
            <summary>
            This method parses the given name for
            capitalization.
            </summary>
        </member>
    </members>
</doc>
Run Code Online (Sandbox Code Playgroud)

  • 但是这些注释也被编译了 - 你不需要做任何奇怪的"doc"工作 - 你可以通过编译一个库并在另一个项目中引用它来测试,并看到intellisense工作正常而不产生任何随机. xml文件. - 所以问题仍然存在 - 你如何通过反思实现这一目标. (2认同)
  • @ BrainSlugs83欢迎在单独的答案中看到您的解决方案.寻求答案的人越多越好. (2认同)

cus*_*ush 7

您还可以创建属性类并以此方式获取信息.所以你的方法/接口看起来像这样:

 [AttributesTest("Test", "Test comments")]
 public void Method(object sender, EventArgs e)
 {
     //do something here
 }
Run Code Online (Sandbox Code Playgroud)

您的属性类将如下所示:

[AttributeUsage(AttributeTargets.Method)]
  sealed class AttributesTest : Attribute 
  {
    public string sName;
    public string sDescription;

    public string Name
    {
      get { return sName; }
      set { sName = value; }
    }

    public string Description
    {
      get { return sDescription; }
      set { sDescription = value; }
    }

    public AttributesTest(string _name, string _desc)
    {
      this.Name = _name;
      this.Description = _desc;
    }
  }
Run Code Online (Sandbox Code Playgroud)

然后,您可以检索每个接口/方法的名称和描述.您并没有真正收到评论,但它会获得您指定的任何信息.当我需要获取有关程序中的方法/接口的信息时,我觉得这很有用.我希望这有帮助!