枚举当前visual studio项目中的所有文件

我正在尝试编写一个简单的Visual Studio 2012扩展。 我已经生成了扩展模板,可以从工具菜单中弹出一个对话框。

我想枚举当前打开的项目中的所有文件,然后根据一些规则过滤它们。 我正在寻找的是一个返回IEnumerable的代码片段。 FileHandle应具有以下接口或类似的东西。

interface IFileHandle { // Return the string string Path; // Open the file in the editor void OpenEditorFor(); } 

仅供参考我正在尝试为visual studio构建模糊文件查找器。 当前文件搜索不太合适,因为您必须具有完全匹配。 我可以处理编写索引器和模糊搜索器,但Visual Studio扩展编写的界面目前有点神秘。

这似乎是一个简单的答案。 在visual studio扩展的上下文中将返回所有文件。

 public IEnumerable Recurse(ProjectItems i) { if (i!=null) { foreach (ProjectItem j in i) { foreach (ProjectItem k in Recurse(j)) { yield return k; } } } } public IEnumerable Recurse(ProjectItem i) { yield return i; foreach (ProjectItem j in Recurse(i.ProjectItems )) { yield return j; } } public IEnumerable SolutionFiles() { Solution2 soln = (Solution2)_applicationObject.Solution; foreach (Project project in soln.Projects) { foreach (ProjectItem item in Recurse(project.ProjectItems)) { yield return item; } } } 

然后你就可以用它做一些巧妙的技巧,比如在我的CommandT克隆核心实现搜索function。

 private static string Pattern(string src) { return ".*" + String.Join(".*", src.ToCharArray()); } private static bool RMatch(string src, string dest) { try { return Regex.Match(dest, Pattern(src), RegexOptions.IgnoreCase).Success; } catch (Exception e) { return false; } } private static List RSearch( string word, IEnumerable wordList, double fuzzyness) { // Tests have prove that the !LINQ-variant is about 3 times // faster! List foundWords = ( from s in wordList where RMatch(word, s) == true orderby s.Length ascending select s ).ToList(); return foundWords; } 

用得像

 var list = RSearch("bnd", SolutionFiles().Select(x=>x.Name))