c#获取接口方法注释

时间:2011-05-02 15:34:45

标签: c# reflection

说我有

    interface IFoo
    {
        /// <summary>
        /// Comments about Bar method goes here.
        /// </summary>
        void Bar();
    }

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

MethodInfo[] mis = typeof(IFoo).GetMethods();

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

谢谢,

4 个答案:

答案 0 :(得分:15)

C#编译器csc.exe有一个/doc选项,用于输出具有三次斜杠注释的外部XML文件。文档生成器使用此XML文件(例如Sandcastle执行此类操作)。

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

  1. 打开项目的“属性”页面。有关详细信息,请参见如何:设置项目属性(C#,J#)。
  2. 单击“构建属性”页面。
  3. 修改XML文档文件属性。
  4. 您可以使用.NET框架中的XML解析器加载此XML文件,访问其中的Types,并从中获取相关的注释。

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

    Instructions for processing the XML file are here on MSDN


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

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

    它在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>
    

答案 1 :(得分:7)

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

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

您的属性类将如下所示:

[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;
    }
  }

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

答案 2 :(得分:4)

添加到John K的答案:无法使用反射检索评论。您始终需要一个提供注释的单独文件。使用编译器中的XML文档文件是最好的方法,因为它是此信息的默认格式。

答案 3 :(得分:1)

解决方法 - 将Program.DLL / EXE上的反射与Program.XML文件一起使用

有关如何实施John K.计划的详细信息,请查看here