如何使用C#中的Reflections从.cs文件中获取类和方法。
如何获取’.cs’文件中可用的类。? 就像我们可以在程序集中使用的类和方法一样,
Assembly.GetTypes() and Type.GetMethods()
获取程序集中的类和方法。
类似地,如何获取C#文件(.cs文件)中的所有类。? 我需要在.cs文件中获取类 ,我可以从中轻松获取其中的方法以及方法参数等详细信息。
如果没有使用C#解析器 ,就没有直接的方法。 您可以使用CSharpCodeProvider
编译.cs
文件(仅当文件自行编译并且您可以将所有引用的程序集告知编译器时才有效)并在生成的程序集上使用reflection。
我建议你使用解析器生成器工具生成一个快速的c#解析器,你可以使用Antlr 。
你也可以检查一下 这个
编译器在编译时会从代码中删除代码文件的所有概念。 也就是说,如果程序集中有可用的调试符号,则可以从中检索所需的信息。
从课堂上你可以随时打电话
this.GetType()
或者你可以随时打电话到课外
obj.GetType()
但是,当您编译应用程序时,这是reflection工作所必需的,您无法再按文件获取它们的定义。
我以前通过调用C#编译器,编译C#文件然后在输出类型上使用reflection来完成此操作。 如果C#文件是独立文件且没有任何依赖项,则可以执行此操作。
但是,正确的方法是使用解析器 – 这并不容易。 有几种选择,MinosseCC就是其中之一。
顺便说一下,C#5.0通过编译String并获取可执行代码,可以使代码动态编写变得更加容易。 不能等待这一点 – 它肯定会让每个读取我代码的人感到困惑。
首先,没有定义类的.cs文件。 一个类可以标记为partial,而part可以在几个.cs文件中定义。
使用调试信息进行编译时,每个方法的文件名都保留在程序集中(对于源文件的每一行,都会标记相应的IL命令)。
不幸的是,我不知道从正在运行的应用程序中获取该信息的简单方法(无需手动解析程序集文件)。
如果您可以安全地调用该方法,则可以调用它并并行构建堆栈跟踪(来自另一个线程) – 在StackFrame对象中,您将找到原始文件名。 但这很慢(因为你必须调用每个方法只是为了发现文件名不同)并且有风险(如果该方法格式化你的硬盘怎么办?)。
所以,你唯一能做的就是尝试自己用像AntLR这样的解析器来解析.cs文件。