到目前为止,从我的测试来看,解决方案文件夹似乎会令人惊讶地转换为 Project 类型,一旦完成,Project.ProjectItems 属性将保存一个可能存在于该文件夹下的项目列表。简而言之,这是至少获取有关事物结构信息的一种方式。然而,问题是位于解决方案文件夹下的每个 ProjectItem 似乎都将 find 转换为 ProjectItem 类型,但似乎无法转换为 Project。
这就是我目前在循环中检测解决方案文件夹的方式。
if(project.Kind == "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}")
{
// TODO: Do your thing
}
这也让我感到沮丧,我还注意到ActiveReports 如何处理解决方案文件夹中的一个错误,这与同一问题有关。
更新!
好的,所以我找到了解决方案,但我不能 100% 声称它,因为我在Macaw's Blog找到了大部分。
因此,看来我最初的发现是正确的,但是为了获得解决方案项下每个 ProjectItem 的实际项目类型,您需要在ProjectItem.SubProject属性下查看。
现在 Macaw 采用递归方法来遍历项目结构,我认为我通常也会推荐这种方法,但是在我的情况下,我想要一个方法实现来简单地注销项目的 XML 表示以进行简单的研究,所以我最终使用了 Stack执行。作为参考,您可以在下面找到我的代码,该代码成功地处理了至少一级解决方案文件夹,其中仅包含项目,没有其他专业解决方案项目。
XElement rootNode = new XElement("Solution");
rootNode.Add(new XAttribute("Name", _applicationObject.Solution.FullName));
Stack<Project> projectStack =
new Stack<Project>(_applicationObject.Solution.Projects.Cast<Project>());
while(projectStack.Count > 0)
{
var project = (Project)projectStack.Pop();
var solutionItemName = "Project";
if(project.Kind == "{66A26720-8FB5-11D2-AA7E-00C04F688DDE}")
{
foreach(ProjectItem innerProject in project.ProjectItems)
{
if(innerProject.SubProject != null)
{
projectStack.Push(innerProject.SubProject);
}
}
solutionItemName = "Folder";
}
var projectNode = new XElement(
solutionItemName,
new XAttribute("Name", project.Name),
new XAttribute("Kind", project.Kind)
);
rootNode.Add(projectNode);
foreach(ProjectItem item in project.ProjectItems)
{
var itemNode = new XElement("Item", new XAttribute("Name", item.Name));
projectNode.Add(itemNode);
if(item.Properties == null)
{
continue;
}
foreach(Property property in item.Properties)
{
var propertyNode = new XElement(property.Name, property.Value);
itemNode.Add(propertyNode);
}
}
}
根据这篇文章的事实以及其他插件中明显的错误,很明显这不是最直观的设计,但这是我们必须忍受的。