Поиск ProjectItem по имени типа через DTE

Учитывая имя типа, возможно ли использовать DTE, чтобы найти ProjectItem, в котором находится тип? Нечто похожее на то, как Navigate To... диалог работает в Visual Studio 2010.

Самое близкое, что я мог найти, это Solution.FindProjectItem, но это берет в имени файла.

Спасибо!

1 ответ

Решение

Я пытался сделать что-то подобное, и придумал следующее: он просто просматривает пространства имен и классы, пока не достигнет того, который вы ищете.

Кажется, что это работает в большинстве случаев, хотя при обнаружении частичного класса он будет возвращать только первое попадание, и, поскольку он является моделью файла, он будет содержать только элементы, содержащиеся в этом файле. Все еще выясняю, что с этим делать.

Это происходит из шаблона 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;
}
Другие вопросы по тегам