从cs文件中获取方法的内容

时间:2008-11-04 12:36:24

标签: c# regex methods

我需要将cs文件中每个方法的内容都放到字符串中。我要找的是当你输入一个cs文件时,返回一个字典,方法名称作为键,方法体作为值。

我尝试过正则表达式并且没有成功反思,有人可以帮忙吗?

由于

6 个答案:

答案 0 :(得分:5)

我不知道它是否对您有用,但Visual Studio Addins包含一个EnvDTE对象,可让您完全访问VB和C#语言解析器。 见Discovering Code with the code Model

几年前我几乎触及了它,我不知道使用它有多困难,或者效果如何,但看起来它会给你所需要的东西。

  

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

如果你完整阅读这篇文章,它会告诉你如何从一个函数的文件中提取全文

希望这会有所帮助:)

答案 1 :(得分:2)

假设文件有效(即编译),您可以先将整个文件读成字符串。

我从你的问题中收集到你只对方法名称感兴趣,而不是在类名中。然后你需要一个正则表达式,它给你所有 public | protected | private ,可选关键字virtual / override等实例, MethodName ,可选参数,。 如果有编码约定会有所帮助,所以你可以假设所有方法定义总是在一行中,而不是分散在几行上。

一旦你有了这个,只需要计算{和}来获取函数体。

最后一条建议:谨防假设。他们有一种令人讨厌的习惯,就是咬着你。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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