【问题标题】:Determining if a EnvDTE.Project is available确定 EnvDTE.Project 是否可用
【发布时间】:2015-04-20 17:37:25
【问题描述】:

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

下面是一个循环,其目标是确定是否保存了当前解决方案中的每个 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;
        }
    }
}

【问题讨论】:

    标签: c# .net envdte


    【解决方案1】:

    你可以用一个简单的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&lt;TResult&gt; 扩展了类型 IEnumerableOfType&lt;TResult&gt; 不能只应用于集合 基于参数化的IEnumerable&lt;T&gt; 类型,但是 基于非参数化 IEnumerable 类型的集合 也。

    【讨论】:

    • 编译器是怎么说的?可能你需要演员或using 指令。
    • 确保您使用 System.Linq;在顶部。
    • 我确实有使用。可能是因为我的 DTE 对象是 EnvDTE80.DTE2 类型的吗?此外,我的“溶胶”属于 EnvDTE 类型。不太清楚为什么它不起作用......
    • sln.Projects 属性的类型是什么?
    • 这是我必须做的:sln.Projects.OfType().Any(pr => pr.ProjectItems != null && pr.Saved);
    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多