通过DTE按类型名称查找ProjectItem

Iga*_*nik 10 vspackage envdte vs-extensibility projectitem

给定一个类型名称,是否可以使用DTE来查找该类型所在的ProjectItem?类似于Navigate To...对话框在Visual Studio 2010中的工作方式.

我能找到的最接近的是Solution.FindProjectItem,但这需要一个文件名.

谢谢!

RSl*_*ter 8

我一直在尝试做类似的事情,并提出了以下内容,它只是搜索命名空间和类,直到它找到你正在寻找的那个.

它似乎在大多数情况下都有效,虽然遇到一个部分类时它只返回第一个命中,因为它是文件的模型,它只包含该文件中的成员.还在搞清楚要做些什么.

这来自T4模板并使用T4 Toolkit(这是TransformationContext的来源),所以如果您不使用它,只需获取项目元素并将Project.CodeModel.CodeElements传递给递归FindClass方法.

示例用法是FindClass("MyCompany.DataClass");

private CodeClass FindClass(string className)
{   
    return FindClass(TransformationContext.Project.CodeModel.CodeElements, className);
}

private CodeClass FindClass(CodeElements elements, string className)
{
    foreach (CodeElement element in elements)
    {       
        if(element is CodeNamespace || element is CodeClass)
        {
            CodeClass c = element as CodeClass;
            if (c != null && c.Access == vsCMAccess.vsCMAccessPublic)
            {
                if(c.FullName == className)
                    return c;

                CodeClass subClass = FindClass(c.Members, className);
                if(subClass!= null)
                    return subClass;
            }

            CodeNamespace ns = element as CodeNamespace;
            if(ns != null)
            {
                CodeClass cc = FindClass(ns.Members, className);
                if(cc != null)
                    return cc;
            }
        }
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)