He estado tratando de hacer algo similar, y he encontrado lo siguiente, que simplemente busca en espacios de nombres y clases hasta que llega al que está buscando.
Parece que funciona en la mayoría de los casos, aunque al encontrar una clase parcial solo devolverá el primer hit, y como es un modelo del archivo, solo tendrá los miembros contenidos en ese archivo. Aún estoy pensando qué hacer al respecto.
Esto viene de una plantilla T4 y está usando T4 Toolkit (que es de donde viene TransformationContext) así que si no está usando eso, simplemente agárrese de un elemento de proyecto y pase Project.CodeModel.CodeElements al recursivo Método FindClass.
El uso de ejemplo sería 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;
}
Gracias! Terminé haciendo algo similar a esto. Voy a aceptar tu respuesta ya que ... bueno, eres la única correcta hasta el momento :) –
Fuera de interés, ¿has tratado con clases parciales en absoluto? Estaba pensando que quizás deba limitar la búsqueda a espacios de nombres particulares, y luego buscar todo el camino, devolver todas las coincidencias. – RSlaughter
En realidad, estoy en busca de un medio para encontrar la declaración de un miembro dentro de un tipo, pero esto me acerca mucho más. ¡Muchas gracias! – TheXenocide