如何使用C#中的Reflections从.cs文件中获取类和方法。

时间:2009-05-25 12:05:48

标签: c# reflection

如何获取'.cs'文件中可用的类。?就像我们可以使用

获取程序集中的类和方法一样
Assembly.GetTypes() and Type.GetMethods()

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

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

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我建议您使用解析器生成器工具生成快速c#解析器,您可以使用Antlr

您也可以查看thisthis

答案 2 :(得分:0)

编译器会在编译时从代码中删除代码文件的所有概念。也就是说,也许可以从调试符号中检索所需的信息(如果它们在程序集中可用)。

答案 3 :(得分:0)

从课堂上你可以随时打电话

this.GetType()

或在课外,你总是可以打电话

obj.GetType()

但是,当您编译一个应用程序时,这是反射工作所必需的,您无法再按文件获取它们的定义。

答案 4 :(得分:0)

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

然而,正确的方法是使用解析器 - 这并不容易。有几种选择,MinosseCC就是其中之一。

顺便说一句,C#5.0通过编译String并获取可执行代码,可以使代码动态编写变得更加容易。不能等待这一点 - 它肯定会让每个看到我代码的人感到困惑。

答案 5 :(得分:0)

首先,没有定义类的.cs文件。一个类可以标记为partial,而part可以在几个.cs文件中定义。

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

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

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

所以,你唯一能做的就是尝试自己用像AntLR这样的解析器来解析.cs文件。