Нахождение ProjectItem именем типа через DTE

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

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

Спасибо!

10
задан Igal Tabachnik 31 March 2010 в 04:31
поделиться

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;
}
8
ответ дан 4 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: