2009-12-29 47 views
5

Mi sto strappando i capelli cercando di risolvere questo problema. Quello che sto cercando di fare è costruire una "mappa" di come gli oggetti vengono usati in un po 'di codice su cui sto lavorando. Pensalo come un miglior uso di Trova. Il modo più semplice per mostrare questo è l'esempio:Riflessione .NET: Trova i tipi usati

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 
    } 
} 

Quello che sto cercando di fare è ottenere una mappatura o di relazione che, nel caso della esempio, darebbe qualcosa di simile:

Type1 usato da: { Type3}

Tipo2 usato da: {Type1, Type3}

Type3 usato da: {Type1, Type2}

Se posso farlo in un dizionario, allora sono a casa. :-)

Quello che ho provato:

ho cercato di andare oltre le assemblee, ogni tipo, ogni metodo quindi tirando le matrici IL e poi cercando di analizzare i operandi senza fortuna. Ho persino provato a esaminare i file sorgente con alcune espressioni regolari, ma ho migliaia di classi da esaminare, scritte in diversi stili diversi, il che significa che mi mancheranno alcuni riferimenti.

Posso usare Riflettore & &/|| Resharper per ottenere un singolo riferimento alla volta, ma mi piacerebbe averli tutti in una volta.

Qualche suggerimento?

+0

Sarebbe un riflettore aggiuntivo che fa il lavoro, essere sufficiente? – driis

+0

Vuoi realizzare questo in modo programmatico o semplicemente usando uno strumento? – Ucodia

+0

C# è un linguaggio di programmazione. Non ha riflessione. Questo è .NET. –

risposta

3

Non è facile. Si dovrà ottenere un'istanza di MethodInfo, PropertyInfo, FieldInfo, ecc per tutti i seguenti:

  • metodi
  • tipi
  • proprietà (get e set)
  • evento (aggiungere e rimuovere)

Poi è necessario analizzare l'iL e chiamare l'istanza ResolveMethod nell'istanza modulo che il tipo in esame è in, e guardare per vedere se l'istanza corrisponde al MethodInfo per il tuo metodo che stai cercando di determinare l'uso di.

EDIT:

come "Trova tutti i riferimenti" in Visual Studio, questo sarà solo trovare diretti riferimenti. Se vuoi anche trovare i riferimenti indiretti (es: metodo1 riferimenti metodo2 e metodo2 riferimenti metodo3 - ti piacerebbe vedere che c'è una connessione da method1 a method3), dovrai farlo con la ricorsione.

7

Suggerisco di utilizzare NDepend per questo, in quanto è fatto su misura per il problema che si sta descrivendo. Fare questo in codice sarà un bel po 'di lavoro.

+0

Secondo le tue raccomandazioni, ho scaricato la traccia di NDepend e ci ho giocato ma non ho trovato il modo di generare il rapporto di cui ho bisogno. Forse dovrò giocarci ancora un po '. –

+0

La matrice delle dipendenze non soddisfa i tuoi bisogni? O semplicemente non entra nei dettagli di cui hai bisogno? – user7116

+0

Con centinaia di classi in uno spazio dei nomi e riferimenti a oggetti in spazi dei nomi fratelli, né la matrice né il grafico sono molto utilizzabili. Uno degli spazi dei nomi più piccoli che devo gestire genera una matrice che è 640 x 640. Per includere tutti gli oggetti, guarderei una matrice di 4300+ x 4300+. In aggiunta a questo è il fatto che il percorso non ti consente di ingrandire. Quindi per il grafico vedo un enorme blob in cui non riesco a scendere alle singole classi. :-( Ma di nuovo non ho avuto molto tempo per vederlo. –

0

Se si sta solo cercando uno strumento, Reflector potrebbe farlo con alcuni componenti aggiuntivi.

Qui troverete una vasta gamma di componenti aggiuntivi: http://reflectoraddins.codeplex.com/

Alcuni plugin come FileGenerator possibile copiare uscita riflettore direttamente in un file.

Problemi correlati