【问题标题】:How to get Classes and methods from a .cs file using Reflections in C#.?如何使用 C# 中的反射从 .cs 文件中获取类和方法?
【发布时间】:2009-05-25 23:18:53
【问题描述】:

如何获取“.cs”文件中可用的类。?就像我们可以使用来获取 Assembly 中的类和方法一样,

Assembly.GetTypes() and Type.GetMethods()

获取程序集中的类和方法。

同样如何获取 C# 文件(.cs 文件)中存在的所有类。?我需要获取 .cs 文件中的类,我可以从中轻松获取其中的方法以及方法参数等更多详细信息。

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    没有使用 C# 解析器,没有直接的方法。您可以使用 CSharpCodeProvider 编译 .cs 文件(仅当文件自行编译并且您可以将所有引用的程序集告知编译器时才有效)并在生成的程序集上使用反射。

    【讨论】:

    • 但是如果我的项目被拆分成多个 .cs 文件并且只编译所有这些文件会给我一个程序集。我实际上需要每个单独的 .cs 文件。
    • 我相信您应该使用 C# 解析器从半有效的 C# 程序中获取这些数据(就像 Visual Studio 使用不完整的 C# 源代码那样)。
    【解决方案2】:

    我推荐你使用解析器生成器工具来生成一个快速的c#解析器,你可以使用Antlr

    您也可以查看thisthis

    【讨论】:

      【解决方案3】:

      编译器会在编译时从您的代码中删除代码文件的所有概念。话虽如此,如果它们在您的程序集中可用,也许可以从调试符号中检索您想要的信息。

      【讨论】:

        【解决方案4】:

        在课堂上你可以随时调用

        this.GetType()
        

        或者在课外你可以随时打电话

        obj.GetType()
        

        但是,当您编译应用程序时,反射工作需要它,您不能再通过文件获取它们的定义。

        【讨论】:

          【解决方案5】:

          我之前通过调用 C# 编译器、编译 C# 文件然后对输出类型使用反射来完成此操作。如果 C# 文件是独立文件并且没有任何依赖项,则这是可能的。

          但是,正确的方法是使用解析器——这并不容易做到。有几个可用的选项,MinosseCC 就是其中之一。

          顺便说一句,C# 5.0 能够编译字符串并取回可执行代码,从而使动态编译代码变得更加容易。等不及了 - 这肯定会让所有阅读我的代码的人感到困惑。

          【讨论】:

          • 您能否详细说明如何调用 c# 编译器并在输出类型上使用反射。或者你能给我几个链接来解决这个问题。
          【解决方案6】:

          首先,没有定义类的 .cs 文件之类的东西。一个类可以标记为部分,部分可以在多个 .cs 文件中定义。

          当您使用调试信息进行编译时,每个方法的文件名都保留在程序集中(对于源文件的每一行,相应的 IL 命令都被标记)。

          不幸的是,我不知道从正在运行的应用程序中获取该信息的简单方法(无需手动解析程序集文件)。

          如果您可以安全地调用该方法,则可以调用它并并行构建堆栈跟踪(来自另一个线程) - 在 StackFrame 对象中,您将找到原始文件名。但这很慢(因为您必须调用每个方法才能发现文件名不同)并且有风险(如果该方法格式化您的硬盘驱动器怎么办?)。

          因此,您唯一可以尝试的方法是自己尝试使用 AntLR 之类的解析器解析 .cs 文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-25
            • 2011-02-11
            • 1970-01-01
            • 1970-01-01
            • 2015-04-14
            • 2010-11-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多