5

我需要将 cs 文件中每个方法的内容转换为字符串。我正在寻找的是当您输入一个 cs 文件时,将返回一个字典,其中方法名称作为键,方法体作为值。

我尝试了正则表达式和反射但没有成功,有人可以帮忙吗?

谢谢

4

6 回答 6

5

我不知道它是否对您有用,但 Visual Studio 插件包含一个 EnvDTE 对象,它使您可以完全访问 VB 和 C# 语言解析器。请参阅使用代码模型发现代码

几年前我偶然接触过它,我不知道它使用起来有多难,也不知道它有多有效,但它看起来确实会给你你需要的东西。

代码模型允许自动化客户端避免为 Visual Studio 语言实现解析器,以便发现项目中的高级定义,例如类、接口、结构、方法、属性等。

如果您完整阅读这篇文章,它会告诉您如何从文件中提取全文以获取函数

希望这可以帮助 :)

于 2008-11-04T13:18:48.457 回答
2

假设文件是​​有效的(即编译),您可以从将整个文件读入字符串开始。

我从您的问题中得知您只对方法名称感兴趣,而不对类名感兴趣。然后,您需要一个正则表达式,它为您提供public|protected|private的所有实例、可选关键字 virtual/override 等、 MethodName(、可选参数)。如果有编码约定会有所帮助,因此您可以假设所有方法定义总是在一行中,而不是分布在多行中。

一旦你有了它,只需计算 { 和 } 即可获得函数体。

最后一个建议:提防假设。他们有咬你屁股的坏习惯。

编辑:哎呀,忘了评论!如果方法主体的注释中有括号,则计数可能会出错。因此,您需要从源代码中删除所有评论作为您的第一步。

于 2008-11-04T12:49:09.233 回答
1

通常,您要解决的问题是以与编译器相同的方式解析 C# 代码,然后保存函数的内容而不是生成代码。因此,作为解决方案的背景,您应该查看 c# 语法以及如何解析它们。

根据 StingyJack 的说法,一个简单的方法是创建一个仅标识函数定义的正则表达式。然后你可以假设中间的一切都是一个函数体。然而,这种假设不会处理一个文件中的多个类,甚至是类末尾的尾随 }。要处理这样的事情,您必须设计 ac# 编译器,因为处理完整的 c# 语法是唯一能够正确识别 c# 认为是函数的东西。

于 2008-11-04T12:53:34.780 回答
0

找到函数头后,计算大括号的数量,直到找到函数的结尾。

于 2008-11-04T12:39:07.960 回答
0

定制的解析器将是最好的选择。正如 Blair 在对 StingyJack 的评论中所说,使用正则表达式解析代码非常困难。我尝试过一次,虽然可以将平衡大括号与 NET 匹配,但转义注释和字符串要复杂得多。

解析器应该使事情变得更简单。请参阅antlr以获得良好的生成器。

至于反射,我相信你可以尝试编译代码(只要你有所有必要的依赖项),然后访问它的内容,就像反射器一样。但我会选择解析器。

于 2008-11-04T12:47:07.943 回答
0

NRefactory 是完成这项工作的工具。看看这里: http: //laputa.sharpdevelop.net/content/binary/NRefactory.wmv

于 2008-11-04T14:23:19.967 回答