2010-03-30 8 views

Respuesta

8

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; 
} 
+0

Gracias! Terminé haciendo algo similar a esto. Voy a aceptar tu respuesta ya que ... bueno, eres la única correcta hasta el momento :) –

+0

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

+0

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

Cuestiones relacionadas