2009-12-29 36 views
5

He estado tirando de mi cabello tratando de resolver esto. Lo que intento hacer es construir un 'mapa' de cómo se usan los objetos en un código en el que estoy trabajando. Piénselo como un uso mejorado de Find. La forma más sencilla de mostrar esto es por ejemplo:.NET Reflection: Encuentra los tipos utilizados

public class MasterClass 
{ 
    Type1 type1; 
    Type2 type2; 
    Type3 type3; 
    void InitializeData() 
    { 
     type1 = new Type1(this); 
     type2 = new Type2(this); 
     type3 = new Type3(this); 
    } 
} 

public class Type1 
{ 
    private MasterClass _master; 
    public Type1(MasterClass master) 
    { 
     _master = master; 
    } 
    public void Something() 
    { 
     //use _master.type2 and _master.type3 here 
    } 
} 

public class Type2 
{ 
    private MasterClass _master; 
    public Type2(MasterClass master) 
    { 
     _master = master; 
    } 
    public void Something() 
    { 
     //use _master.type3 here 
    } 
} 

public class Type3 
{ 
    private MasterClass _master; 
    public Type3(MasterClass master) 
    { 
     _master = master; 
    } 
    public void Something() 
    { 
     //use _master.type1 and _master.type2 here 
    } 
} 

Lo que estoy tratando de hacer es conseguir un mapeo o informan de que, en el caso del ejemplo, daría algo así como:

Tipo1 utilizado por: { Tipo 3}

Type2 utilizado por: {Tipo 1, Tipo 3}

tipo3 utilizado por: {Tipo 1, Tipo 2}

Si puedo conseguirlo en un diccionario, entonces estoy en casa. :-)

Lo que he intentado:

He intentado ir a través de los ensamblajes, cada tipo, cada método continuación, tirando de las matrices de IL y luego intentar analizar los operandos sin suerte. Incluso he intentado revisar los archivos fuente con algunas expresiones regulares, pero tengo miles de clases para revisar, escritas en varios estilos diferentes, lo que significa que omitiré algunas referencias.

Puedo usar Reflector & &/|| Resharper para obtener una referencia única a la vez, pero me gustaría obtenerlos todos a la vez.

¿Alguna sugerencia?

+0

¿Un reflector complemento que hace el trabajo, ser adecuada? – driis

+0

¿Desea lograr esto de forma programática o simplemente usando una herramienta? – Ucodia

+0

C# es un lenguaje de programación. No tiene Reflexión Eso es .NET. –

Respuesta

3

No es fácil. Usted tendrá que obtener una instancia de MethodInfo, PropertyInfo, FieldInfo, etc para todos los siguientes: métodos

  • tipos
  • propiedades (get y set)
  • evento (agregar y quitar)

a continuación, tendrá que analizar la IL y llamar a la instancia ResolveMethod en la instancia del módulo que el tipo está siendo examinado, y mira a ver si la instancia corresponde a la MethodInfo para su método que está tratando de determinar el uso de.

EDIT:

Como "Encuentra todas las referencias" en Visual Studio, esto sólo encontrará directos referencias. Si también desea encontrar referencias indirectas (por ejemplo, método1 referencias método2, y método2 referencias método3 - le gustaría ver que hay una conexión de método1 a método3), tendrá que hacer esto con recursividad.

7

Sugiero usar NDepend para esto, ya que está hecho a medida para el problema que está describiendo. Hacer esto en código va a ser bastante trabajo.

+0

En su recomendación, he descargado el rastro de NDepend y he jugado con él, pero no he encontrado la forma de generar el informe que necesito. Puede que tenga que jugar con eso un poco más. –

+0

¿La matriz de dependencias no se ajusta a sus necesidades? ¿O simplemente no entra en los detalles que necesita? – user7116

+0

Con cientos de clases en un espacio de nombres y referencias a objetos en espacios de nombres hermanos, ni la matriz ni el gráfico son muy utilizables. Uno de los espacios de nombres más pequeños con los que debo lidiar genera una matriz de 640 x 640. Para incluir todos los objetos, miraría una matriz de 4300+ x 4300+. Agregando a esto está el hecho de que el camino no te permite hacer un acercamiento. Por lo tanto, para el gráfico, veo un gran blob donde no puedo acceder a las clases individuales. :-( Pero nuevamente no he tenido mucho tiempo para mirarlo. –

0

Si solo está buscando una herramienta, Reflector podría hacerlo con algunos complementos.

Aquí encontrará una amplia gama de complementos: http://reflectoraddins.codeplex.com/

Algunos plugins como FileGenerator pueden copiar salida reflector directamente en un archivo.

Cuestiones relacionadas