确定EnvDTE.Project是否可用

时间:2015-04-20 17:37:26

标签: c# .net envdte

我必须经历一个包含不可用项目的大解决方案。这些不可用的项目不可用,因为它们的路径不再存在。如果这个解决方案要保留这些不可用的引用,是否有办法确定我循环的每个项目是否可用/不可用?

下面是一个循环,其目的是确定当前解决方案中的每个ProjectItem是否都已保存。但是,由于某些项目不可用,我不断获得空引用。

bool isDirty = false;
foreach (Project proj in sln.Projects) //sln is my current solution
{
    if (proj == null) //hoping that might do the trick
        continue;
    foreach (ProjectItem pi in proj.ProjectItems)
    {
        if (pi == null) //hoping that might do the trick
            continue;
        if (!pi.Saved)
        {
            isDirty = true;
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您可以在简单的LINQ操作中重写此内容:

//import the LINQ extensions
using System.Linq;
// some code here;
bool isDirty = sln.Projects.Any(pr => pr.ProjectItems != null && !pr.Saved);

根据MSDN,_Solution.Projects属性是Projects类型,这是IEnumerable没有通用的,所以你应该使用OfType<TResult>扩展方法,就像这样:

bool isDirty = sln.Projects.OfType<Project>().Any(pr => pr.ProjectItems != null && !pr.Saved);

来自MSDN:

  

此方法是少数可以使用的标准查询运算符方法之一   应用于具有非参数化类型的集合,例如   ArrayList。这是因为OfType<TResult>扩展了类型   IEnumerableOfType<TResult>不仅可以应用于集合   它基于参数化的IEnumerable<T>类型,但是   基于非参数化IEnumerable类型的集合   还