C# 确定环境项目是否可用

C# 确定环境项目是否可用,c#,.net,envdte,C#,.net,Envdte,我必须经历一个包含不可用项目的大型解决方案。这些不可用的项目不可用,因为它们的路径不再存在。如果此解决方案保留这些不可用的引用,是否有方法确定我正在循环的每个项目是否可用 下面是一个循环,其目标是确定是否保存了当前解决方案中的每个项目项。但是,由于某些项目不可用,我不断得到空引用 bool isDirty = false; foreach (Project proj in sln.Projects) //sln is my current solution { if (proj == n

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

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

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;
        }
    }
}

您可以在一个简单的
LINQ
操作中重写它:

//import the LINQ extensions
using System.Linq;
// some code here;
bool isDirty = sln.Projects.Any(pr => pr.ProjectItems != null && !pr.Saved);
根据MSDN,属性是一个类型化的,它是一个不带泛型的
IEnumerable
,因此您应该使用扩展方法,如下所示:

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

此方法是少数几个可以使用的标准查询运算符方法之一 应用于具有非参数化类型的集合,例如
阵列列表
。这是因为类型的
扩展了类型
IEnumerable
<类型为
的代码>不能仅应用于集合 基于参数化的
IEnumerable
类型,但 基于非参数化
IEnumerable
类型的集合 还有


编译器说什么?可能您需要强制转换或
使用
指令。请确保您具有using System.Linq;在上面,我有使用权。可能是因为我的DTE对象是EnvDTE80.DTE2类型的吗?另外,我的“sol”是EnvDTE类型的。不太清楚它为什么不起作用…sln.Projects属性的类型是什么?下面是我必须做的:sln.Projects.OfType().Any(pr=>pr.ProjectItems!=null&&pr.Saved);