Finding a ProjectItem by type name via DTE
Asked Answered
P

1

11

Given a type name, is it possible to use DTE to find the ProjectItem that the type is located in? Something similar to how the Navigate To... dialog works in Visual Studio 2010.

The closest I could find is Solution.FindProjectItem, but that takes in a file name.

Thanks!

Plastid answered 30/3, 2010 at 22:32 Comment(0)
H
9

I've been trying to do something similar, and have come up with the following, which simply searches through namespaces and classes until it hits the one you're looking for.

It seems to work in most cases although when encountering a partial class it will only return the first hit, and as it's a model of the file it will only have the members contained in that file. Still figuring out what to do about that.

This comes from a T4 template and is using T4 Toolkit (which is where TransformationContext comes from) so if you're not using that, just get a hold of a project element and pass Project.CodeModel.CodeElements to the recursive FindClass method.

Example usage would be 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;
}
Henrie answered 7/6, 2010 at 15:29 Comment(4)
Thanks! I ended up actually doing something similar to this. I'm going to accept your answer since... well you're the only one right so far :)Plastid
Out of interest, have you dealt with partial classes at all? I was thinking I may just have to limit the searching to particular namespaces, and then search all the way through, returning all matches.Henrie
I'm actually in search of a means of finding the declaration of a member inside a type, but this gets me much closer. Many thanks!Mithridatism
This iterative approach is very, very slow. In my VS solution with about 60 projects this code is executed a dozen or so seconds, therefore it is not acceptable. I guess it's time consuming operation, but I believe there is a faster way to reach a goal. Resharper and it's types collecting module does this job faster during initialization.Si

© 2022 - 2024 — McMap. All rights reserved.