2012-05-05 7 views
5

これはanother question I asked beforeに関連する質問です。オーバーロードされたメソッドがあります:反射によってオーバーロードされたメソッドを見つける方法

public void Add<T>(SomeType<T> some) { } 

public void Add<T>(AnotherType<T> another) { } 

どのように各メソッドをリフレクションで見つけることができますか?例えば反射でAdd<T>(SomeType<T> some)メソッドを取得するにはどうすればよいですか?私を助けてくれますか?前もって感謝します。 METHODINFOメンバーに

答えて

6

ここでは、パラメータがSomeType<T>であることを説明します。ここで、Tは、Addメソッドのジェネリックタイプです。

これ以外にも、CastroXXLのように標準的な反射を使用しています。

は、ここで私はそれをやった方法は次のとおりです。

var theMethodISeek = typeof(MyClass).GetMethods() 
    .Where(m => m.Name == "Add" && m.IsGenericMethodDefinition) 
    .Where(m => 
      { 
       // the generic T type 
       var typeT = m.GetGenericArguments()[0]; 

       // SomeType<T> 
       var someTypeOfT = 
        typeof(SomeType<>).MakeGenericType(new[] { typeT }); 

       return m.GetParameters().First().ParameterType == someTypeOfT; 
      }) 
    .First(); 
+0

それは動作します。だから感謝 –

+0

申し訳ありませんが、別のポイント。型がジェネリック型の制約に従うかどうかを検出する方法? –

+0

'typeof(SomeType <>)。GetGenericArguments()。First()。GetGenericParameterConstraints()'および 'Type.IsAssignableFrom'メソッドを参照してください:http://msdn.microsoft.com/en-私/ライブラリ/ system.type.isassignablefrom.aspx私はそれらを組み合わせると思うものを得るだろう – GolfWolf

関連する問題