【发布时间】:2009-05-25 23:18:53
【问题描述】:
如何获取“.cs”文件中可用的类。?就像我们可以使用来获取 Assembly 中的类和方法一样,
Assembly.GetTypes() and Type.GetMethods()
获取程序集中的类和方法。
同样如何获取 C# 文件(.cs 文件)中存在的所有类。?我需要获取 .cs 文件中的类,我可以从中轻松获取其中的方法以及方法参数等更多详细信息。
【问题讨论】:
标签: c# reflection
如何获取“.cs”文件中可用的类。?就像我们可以使用来获取 Assembly 中的类和方法一样,
Assembly.GetTypes() and Type.GetMethods()
获取程序集中的类和方法。
同样如何获取 C# 文件(.cs 文件)中存在的所有类。?我需要获取 .cs 文件中的类,我可以从中轻松获取其中的方法以及方法参数等更多详细信息。
【问题讨论】:
标签: c# reflection
没有使用 C# 解析器,没有直接的方法。您可以使用 CSharpCodeProvider 编译 .cs 文件(仅当文件自行编译并且您可以将所有引用的程序集告知编译器时才有效)并在生成的程序集上使用反射。
【讨论】:
编译器会在编译时从您的代码中删除代码文件的所有概念。话虽如此,如果它们在您的程序集中可用,也许可以从调试符号中检索您想要的信息。
【讨论】:
在课堂上你可以随时调用
this.GetType()
或者在课外你可以随时打电话
obj.GetType()
但是,当您编译应用程序时,反射工作需要它,您不能再通过文件获取它们的定义。
【讨论】:
我之前通过调用 C# 编译器、编译 C# 文件然后对输出类型使用反射来完成此操作。如果 C# 文件是独立文件并且没有任何依赖项,则这是可能的。
但是,正确的方法是使用解析器——这并不容易做到。有几个可用的选项,MinosseCC 就是其中之一。
顺便说一句,C# 5.0 能够编译字符串并取回可执行代码,从而使动态编译代码变得更加容易。等不及了 - 这肯定会让所有阅读我的代码的人感到困惑。
【讨论】:
首先,没有定义类的 .cs 文件之类的东西。一个类可以标记为部分,部分可以在多个 .cs 文件中定义。
当您使用调试信息进行编译时,每个方法的文件名都保留在程序集中(对于源文件的每一行,相应的 IL 命令都被标记)。
不幸的是,我不知道从正在运行的应用程序中获取该信息的简单方法(无需手动解析程序集文件)。
如果您可以安全地调用该方法,则可以调用它并并行构建堆栈跟踪(来自另一个线程) - 在 StackFrame 对象中,您将找到原始文件名。但这很慢(因为您必须调用每个方法才能发现文件名不同)并且有风险(如果该方法格式化您的硬盘驱动器怎么办?)。
因此,您唯一可以尝试的方法是自己尝试使用 AntLR 之类的解析器解析 .cs 文件。
【讨论】: