2012-07-31 8 views
5

jeśli mamUstalenie wszystkich typów używanych przez pewnego typu w C# za pomocą refleksji

class A 
{ 
    public void DoStuff() 
    { 
     B b; 
    } 
} 

struct B {} 
struct C {} 

i mam typeof(A),

Chciałbym uzyskać listę wszystkich typów używanych przez A. w ten Przypadek byłby to typeof(B), a nie typeof(C).

Czy jest to dobry sposób na zrobienie tego z refleksją?

+2

Jest to dość łatwo dostać się do wszystkich rodzajów _members_ z 'A' poprzez' 'Type.GetProperties' Type.GetFields' (lub' Type.GetMembers'), a więc na. Ale zastanawianie się, jakie typy są używane lokalnie w ramach metody? Nie tak pewny. –

+0

Czy potrzebujesz tego w czasie wykonywania? Czy masz dostęp do kodu, czy po prostu masz typ? – Martin1921

+0

Podobne pytania: http://stackoverflow.com/questions/1975702/net-reflection-find-used-types – VS1

Odpowiedz

8

Należy spojrzeć na klasę MethodBody (jest bardzo dobry przykład jej użycia w łączu). Pozwoli Ci to napisać kod jak:

MethodInfo mi = typeof(A).GetMethod("DoStuff"); 
MethodBody mb = mi.GetMethodBody(); 
foreach (LocalVariableInfo lvi in mb.LocalVariables) 
{ 
    if (lvi.LocalType == typeof(B)) 
     Console.WriteLine("It uses a B!"); 
    if (lvi.LocalType == typeof(C)) 
     Console.WriteLine("It uses a C!"); 
} 
+0

Przepraszam, jeśli nie było to jasne z postu. Nie chcę wiedzieć, że istnieją B i C. jeśli A również używa D, również chciałbym to odkryć. –

+0

Jak widać w moim kodzie, mb.LocalVariables zwraca listę wszystkich typów, których używa metoda. To powinno być dokładnie to, czego potrzebujesz, aby odkryć, czy używa B, C, D czy nawet Z. –

Powiązane problemy