2012-07-31 9 views
5

を使用してC#での特定の種類によって使用されるすべてのタイプを決定私はは反射

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

struct B {} 
struct C {} 

を持っていると私はtypeof(A)

を持っている場合、私はこの中でAによって使用されるすべてのタイプのリストを取得したいと思いますその場合はtypeof(B)で、typeof(C)ではありません。

反射でこれを行うには良い方法がありますか?

+2

それはとても 'Type.GetFields'、' Type.GetProperties'(または 'Type.GetMembers')を介してA''の_members_のすべてのタイプを取得するには非常に簡単ですに。しかし、どのような型がメソッド内でローカルに使われているのかを理解していますか?それほど確かではない。 –

+0

これは実行時に必要ですか?あなたはコードにアクセスできますか?それとも、タイプだけですか? – Martin1921

+0

同様のSO Ques:http://stackoverflow.com/questions/1975702/net-reflection-find-used-types – VS1

答えて

8

MethodBodyクラスをご覧になる必要があります(このリンクには非常に良い例があります)。これはあなたのようなコードを書くようになる:

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

投稿からはっきりしない場合は申し訳ありません。私はBとCが存在するという事実を知る必要はありません。 AもDを使っているのなら、それも見つけたいと思います。 –

+0

私のコードで分かるように、mb.LocalVariablesはメソッドが使用するすべての型のリストを返します。 B、C、D、またはZを使用している場合は、これを正確に検出する必要があります。 –