Поиск ProjectItem по имени типа через DTE - PullRequest
9 голосов
/ 31 марта 2010

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

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

Спасибо!

1 Ответ

8 голосов
/ 07 июня 2010

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

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

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