2009-12-29 20 views
5

Ich habe mir die Haare ausgezogen, um das Problem zu lösen. Was ich versuche, ist eine "Karte" zu erstellen, wie Objekte in ein bisschen Code verwendet werden, an dem ich gerade arbeite. Betrachten Sie es als eine erweiterte Nutzung. Der einfachste Weg, dies zu zeigen, ist mit gutem Beispiel:.NET Reflection: Hier finden Sie gebrauchte Typen

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

Was ich versuche, ist eine Zuordnung zu tun bekommen oder dass berichten, im Fall des Beispiels würde so etwas geben: von

Typ1 verwendet: { Typ3}

Typ2 eingesetzt durch: {Typ1, Typ3}

Typ3 verwendet durch: {Typ1, Typ2} ​​

Wenn ich es in ein Wörterbuch bekommen kann, dann bin ich nach Hause. :-)

Was ich versucht habe:

Ich habe versucht, über die Versammlungen gehen, jede Art, dann wird jedes Verfahren des IL-Arrays ziehen und dann ohne Glück die Operanden zu analysieren versucht. Ich habe sogar versucht, die Source-Dateien mit einigen regulären Ausdrücken zu durchsuchen, aber ich habe Tausende von Klassen, die in verschiedenen Stilen geschrieben sind, was bedeutet, dass ich einige Referenzen verpasse.

Ich kann Reflektor & &/|| verwenden Resharper, um eine einzelne Referenz zu einer Zeit zu bekommen, aber ich möchte sie alle auf einmal bekommen.

Irgendwelche Vorschläge?

+0

Würde ein Reflector Add-in, dass die Arbeit erledigt, angemessen? – driis

+0

Möchten Sie dies auf programmatische Weise erreichen oder einfach nur ein Werkzeug verwenden? – Ucodia

+0

C# ist eine Programmiersprache. Es hat keine Reflexion. Das ist .NET. –

Antwort

3

Es ist nicht einfach.

  • Methoden
  • Typen
  • Eigenschaften (get und set)
  • Ereignis (hinzufügen und entfernen): Sie erhalten eine Instanz von Method, Propertyinfo, Fieldinfo, etc. für alle folgenden bekommen müssen

Dann müssen Sie die IL und rufen Sie die ResolveMethod Instanz auf der Modul Instanz analysieren, dass die Art in geprüft wird, und sehen, ob die Instanz des Method entspricht für Ihre Methode, die Sie versuchen, die Verwendung von zu bestimmen.

EDIT:

Like "Alle Verweise" in Visual Studio, dies wird nur direkte Referenzen. Wenn Sie auch indirekte Referenzen finden möchten (z. B. method1 references method2 und method2 references method3 - Sie möchten sehen, dass eine Verbindung von method1 zu method3 besteht), müssen Sie dies mit Rekursion tun.

7

Ich empfehle die Verwendung NDepend für diese, wie es auf das Problem zugeschnitten ist, das Sie beschreiben. Das im Code zu tun wird eine Menge Arbeit sein.

+0

Auf Ihre Empfehlung habe ich die Spur von NDepend heruntergeladen und habe damit gespielt, aber ich habe keinen Weg gefunden, den Bericht zu generieren, den ich brauche. Ich muss vielleicht noch etwas damit spielen. –

+0

Die Abhängigkeitsmatrix war nicht Ihren Anforderungen? Oder geht es einfach nicht ins Detail, das Sie brauchen? – user7116

+0

Mit Hunderten von Klassen in einem Namespace und Verweisen auf Objekte in Geschwister-Namespaces ist weder die Matrix noch der Graph sehr brauchbar. Einer der kleineren Namespaces, mit denen ich mich befassen muss, erzeugt eine Matrix von 640 x 640. Um alle Objekte einzubeziehen, würde ich eine Matrix von 4300+ x 4300+ betrachten. Hinzu kommt die Tatsache, dass die Spur Sie nicht hineinzoomen lässt. So für die Grafik sehe ich einen riesigen Blob, wo ich nicht zu einzelnen Klassen kommen kann. :-( Aber wieder hatte ich nicht viel Zeit, um es zu betrachten. –

0

Wenn Sie nur nach einem Werkzeug suchen, könnte Reflector es mit einigen Add-Ins machen.

Hier finden Sie eine große Auswahl an Add-Ins finden: http://reflectoraddins.codeplex.com/

Einige Plugins wie FileGenerator können Reflector Ausgabe direkt in eine Datei kopieren.