【问题标题】:Is it possible to obtain class summary at runtime?是否可以在运行时获取类摘要?
【发布时间】:2010-10-10 04:18:37
【问题描述】:

是否可以在 C# 中在运行时获取类摘要? 我想通过反射获得课程摘要,然后将其写入控制台。 类摘要是指类定义之前的摘要 cmets,如下所示:

/// <summary>
/// some description
/// </summary>
class SomeClass
{
}

我不知道这些cmets在编译代码后是否可用,但如果它们有可能有办法在代码中获取它们。

提前感谢您的帮助。

【问题讨论】:

    标签: c# reflection class comments summary


    【解决方案1】:

    前段时间我曾经搞砸过这个问题,并使用了这个家伙的解决方案。效果不错:

    http://jimblackler.net/blog/?p=49

    【讨论】:

    • 稍微详细说明您的答案:此解决方案实际上提供了一种虚拟链接到生成的 xml 文档的解决方法。因此它适用于您自己的代码以及大多数第 3 方库(OSS 和商业)。但是在某些情况下,您无法获取 xml 文档,因此通常是不可能的。
    • 请附上您的链接的相关细节;不幸的是,如果链接在将来失效,使这个答案毫无用处 - 特别是因为它是公认的答案。
    【解决方案2】:

    我在 CodePlex 上维护 Jolt.NET 项目,并实现了一项功能来执行这项任务。更多信息请参考Jolt库。

    本质上,该库允许您使用System.Reflection 中的元数据类型(即MethodInfoPropertyInfo 等...)以编程方式定位和查询XML doc cmets 文件以查找程序集。

    【讨论】:

      【解决方案3】:

      您无法在运行时访问它们,因为它们被编译器视为 cmets。

      但是,如果您想使用属性来指定信息并在运行时通过反射访问它,您可以这样做。

      请参阅Creating Custom Attributes (C# Programming Guide) 了解属性创建和Accessing Attributes With Reflection (C# Programming Guide) 了解运行时访问权限。

      来自 MSDN 的示例:

      作者.cs:

      public class Author : System.Attribute
      {
          private string name;
          public double version;
      
          public Author(string name)
          {
              this.name = name;
              version = 1.0;
          }
      }
      

      SampleClass.cs:

      [Author("H. Ackerman", version = 1.1)]
      class SampleClass
      {
          // H. Ackerman's code goes here...
      }
      

      【讨论】:

      • 这是一个解决方案,但如果你使用它,你必须写两次你的帮助。一个在属性中,另一个在摘要中,如果您想在智能上阅读它。 :(
      【解决方案4】:

      不,这些 cmets 不包含在您编译的程序集中。

      Visual Studio 可以在包含这些 cmets 的输出文件夹 (\bin\your_project.xml) 中创建一个 .xml 文件。如果您的应用程序与该 xml 文件一起分发,那么您将能够以编程方式访问它。

      【讨论】:

        【解决方案5】:

        不,它们不能通过反射获得。见msdn

        XML doc cmets 不是元数据; 它们不包含在编译中 组装,因此它们不是 可通过反射访问。

        【讨论】:

          【解决方案6】:

          如果您发出 XML 文档文件,您可以。该过程将涉及使用反射来获取该类型的所有公共成员,然后使用 XPath 从生成的 XML 文档中读取文档。

          更新:要在您的 dll/exe 中包含 XML 文档,只需将其添加为嵌入式资源,如果文档更改,则编译两次。

          【讨论】:

          • 这个解决方案+1。我做了一个读取xml的类。如果您错过了对公共方法的评论,也会收到警告,以免您错过。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多