Спасибо, Рид; статья, которую вы связали, дала мне достаточно далеко, чтобы за пару минут получить подтверждение концепции.
Поскольку я чувствую, что это связано, вот итерационные и рекурсивные средства, с помощью которых я собрал элементы ProjectItems. Я сделал это в DXCore, но та же идея применима и к сырому Visual Studio SDK (DXCore - просто более приятная оболочка над SDK). Объекты «Solution», «Projects», «Project» и «ProjectItem» находятся прямо в EnvDTE.
Настройка проектов
EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution;
EnvDTE.Projects projects = solution.Projects;
Итерации по проектам для извлечения элементов ProjectItems
var projects = myProjects.GetEnumerator();
while (projects.MoveNext())
{
var items = ((Project)projects.Current).ProjectItems.GetEnumerator();
while (items.MoveNext())
{
var item = (ProjectItem)items.Current;
//Recursion to get all ProjectItems
projectItems.Add(GetFiles(item));
}
}
Наконец, рекурсия, которую я делаю для получения всех ProjectItems в активном решении
ProjectItem GetFiles(ProjectItem item)
{
//base case
if (item.ProjectItems == null)
return item;
var items = item.ProjectItems.GetEnumerator();
while (items.MoveNext())
{
var currentItem = (ProjectItem)items.Current;
projectItems.Add(GetFiles(currentItem));
}
return item;
}