Encontrar um ProjectItem por Nome do Tipo via DTE
-
23-09-2019 - |
Pergunta
Dado um nome de tipo, é possível usar o DTE para encontrar o ProjectEM em que o tipo está localizado? Algo semelhante a como o Navigate To...
O diálogo funciona no Visual Studio 2010.
O mais próximo que pude encontrar é Solution.FindProjectItem
, mas isso leva um nome de arquivo.
Obrigado!
Solução
Eu tenho tentado fazer algo semelhante e criei o seguinte, o que simplesmente pesquisa em namespaces e classes até que ele atinja o que você está procurando.
Parece funcionar na maioria dos casos, embora, ao encontrar uma classe parcial, ele retornará apenas o primeiro acerto e, como é um modelo do arquivo, ele terá apenas os membros contidos nesse arquivo. Ainda descobrindo o que fazer sobre isso.
Isso vem de um modelo T4 e está usando o T4 Toolkit (que é de onde vem o TransformationContext); portanto, se você não estiver usando isso, basta pegar um elemento do projeto e aprovar o projeto.codemodel.codeElements para o método FindClass recursivo.
Exemplo de uso seria 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;
}