【发布时间】:2013-12-10 20:53:47
【问题描述】:
这种类型与question I had earlier about a regex to search for a method containing a particular string 相关联,有人建议我使用这个名为 Roslyn 的 MS 工具,但自 2012 年问世以来,它不适用于 VS2010。
所以我正在编写这个小实用程序来保留我的解决方案中包含特定方法声明的每个文件的列表(例如 25k 文件中的 3k 重载此方法)。然后我只想将该文件列表过滤为仅在方法主体内包含+= 的文件。
static void DirSearch(string dir)
{
string[] files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories);
foreach (var file in files)
{
var contents = File.ReadAllText(file);
if (contents.Contains("void DetachEvents()"))
{
//IF DetachEvents CONTAINS += THEN...
WriteToFile(file);
}
}
}
此方法遍历所有文件夹并将文件名写入文本文件(如果它包含关键方法),但我不知道如何仅提取方法主体中的任何内容,因为它重载了该方法的所有 3K 实例不一样。
最好的方法是获取方法名称的索引,然后是每个 { 和 } 的索引,直到遇到下一个访问器修饰符(表示我已经到了 DetachEvents 的末尾) ?然后我可以在indexOfMethod 和indexOfEndMethod 之间搜索+=。
但这听起来真的很草率,我希望有人可能有更好的主意?
【问题讨论】:
-
@P.Brian.Mackey 我不确定你的意思。我不打算让我的工具修改任何代码,只是告诉我哪些有错误。所以,它只是读取它们的内容,如果它们有明显的数据,则将文件名写入本地文件,让我回去手动更改。我不希望错误数据的数量惊人,但我不想手动检查 3K 文件;)
-
你的代码库中真的有 3,000 个相同方法的不同重载吗?
-
@acfrancis 在我的帖子中快速运行代码而不进行任何“过滤”会产生一个包含大约 2.9k 条目的文本文件。它们实际上并没有从一个公共接口重载方法,但它们只是具有相同的方法签名(
private void DetachEvents()),并且顾名思义,将事件从其上的每个控件中分离出来。与重载不完全相同,但足够接近,为了简单起见,我只是这么称呼它。 -
对,我想你可以从方法签名中读取文件,计算打开和关闭花括号,直到它们平衡(这可能是方法的结尾),同时寻找
+=时间。这并不准确,因为您可能会计算字符串或 cmets 中的内容,但应该非常接近。 -
+= 可以在方法主体中的任何位置,或者您可以缩小您正在寻找的语法位吗?