2009-12-29 43 views
5

Bunu çözmeye çalışırken saçlarımı çekiyorum. Yapmaya çalıştığım şey, üzerinde çalıştığım bir kodda nesnelerin nasıl kullanıldığıyla ilgili bir 'harita' oluşturmak. Gelişmiş Bulma Kullanımları olarak düşünün. Bunu göstermek için en kolay yolu örnek gereğidir:. NET Yansıma: Kullanılan türleri bul

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

Ne yapmaya çalışıyorum bir eşleme almak ya Örnekteki durumda, rapor, gibi bir şey verecekti geçerli: kullandığı

TİP1: { tarafından kullanılan Type3}

tip2: sonra ben evdeyim bir sözlüğüne onu alabilirsen {TİP1, tİP2}

: {TİP1, Type3} tarafından kullanılan

Type3. :-)

denedim Ne:

Her yöntem daha sonra IL dizileri çekerek ve ardından hiçbir şans ile işlenen ayrıştırmak çalışırken, meclisleri, her tür üzerinden gidiyor çalıştılar. Hatta bazı normal ifadelerle kaynak dosyaları üzerinde çalışmayı denedim ama birkaç farklı stilde yazdığım binlerce dersim var, bu da bazı referansları kaçırmam anlamına geliyor.

Reflector & &/|| Bir seferde tek bir referans almak için yeniden paylaşan ama hepsini bir seferde almak istiyorum.

Herhangi bir öneriniz var mı?

+0

için güzel bir çözüm söz bir Reflektör içinde eklenti misiniz, yeterli? – driis

+0

Bunu programlı bir şekilde mi yoksa sadece bir araç kullanarak mı gerçekleştirmek istiyorsunuz? – Ucodia

+0

C# bir programlama dilidir. Yansıma yok. Bu .NET. –

cevap

3

Kolay değil.

  • tip

    • yöntemlerle
    • özelliklerini (get ve set)
    • olay (eklemek ve kaldırmak): Aşağıdaki tümü için MethodInfo, PropertyInfo, Fieldınfo, vb bir örneğini almak zorunda kalacak

    Sonra örnek MethodInfo karşılık görmek için IL ayrıştırmak ve tip içinde olduğu incelenmekte olan bu modülü örneğinde ResolveMethod örneğini arama ve bakmak gerekir kullandığınız yöntemi belirlemeye çalıştığınız yöntem için.

    DÜZENLEME: Visual Studio "Tüm başvurular Bul", bu sadece direkt referans bulacaksınız gibi

    . Ayrıca, dolaylı referanslarını bulmak isterseniz (örn: method1 başvuruları method2 ve method2 referansları method3 - method1'den method3'e bir bağlantı olduğunu görmek istersiniz), bunu yinelemeyle yapmanız gerekir.

  • 7

    Bunun için NDepend kullanmanızı öneririz, çünkü tanımladığınız soruna özel olarak hazırlanmıştır. Bunu kod içinde yapmak epeyce işe yarayacak.

    +0

    Tavsiyeniz NDepend'in izini indirdim ve onunla oynadım ancak ihtiyacım olan raporu üretmenin bir yolunu bulamadım. Bununla biraz daha oynamak zorunda kalabilirim. –

    +0

    Bağımlılık Matrisi ihtiyaçlarınızı karşılamıyor mu? Yoksa ihtiyacın olan detaylara girmiyor mu? – user7116

    +0

    Bir isim alanında yüzlerce sınıf ve kardeş adındaki nesnelere yapılan başvurular, ne matris ne de grafikte kullanılabilir. 640 x 640'lık bir matris oluşturmak için uğraşmam gereken daha küçük ad alanlarından biri. Tüm nesneleri dahil etmek için 4300+ x 4300+ matrisine baktım. Buna ek olarak, iz, yakınlaştırma yapmanıza izin vermez. Bu nedenle grafikte, bireysel sınıflara inemeyeceğim büyük bir blob görüyorum. :-( Ama yine de ona bakmak için çok fazla zamanım olmadı –

    0

    Yalnızca bir araç arıyorsanız, Reflektör bunu bazı eklentilerle yapabilir.FileGenerator gibi http://reflectoraddins.codeplex.com/

    Bazı eklentileri bir dosyaya doğrudan Reflektör çıkışını kopyalayabilirsiniz:

    Burada eklentiler geniş bir yelpazede bulacaksınız. O işi yapar