2013-07-10 12 views
9

私はIEnumerable<T>を持っていますので、Enumerable.Containsメソッドを反映させたいと思います。私は文法の権利を得るのに苦労しています。ここに私が現在持っているものがあります:一般拡張メソッドのMethodInfoを取得するには?

var containsMethod = typeof(Enumerable).GetMethod("Contains", 
    new[] { 
    typeof(IEnumerable<T>), 
    typeof(T) 
    }); 

これはちょうどnullで戻ってきます。

MethodInfoを取得する正しい方法は何ですか?

+0

[重複した正しいジェネリックメソッドの選択](http://stackoverflow.com/questions/3631547/select-right-generic-method-with-reflection) – nawfal

答えて

17

MethodInfoを取得する正しい方法は何ですか?残念ながら、痛みのビットです - - し、適切な引数を持つことを構築

あなたがジェネリック方法を見つける必要があります。この場合、あなただけの2 Containsオーバーロードがあることを知っている、とあなたが使用できるようにしたい1は、二つの引数を持っています

var method = typeof(Enumerable).GetMethods() 
           .Where(m => m.Name == "Contains") 
           .Single(m => m.GetParameters().Length == 2) 
           .MakeGenericMethod(typeof(T)); 

あなたはその後、適切にそれを呼び出すことができるはずです。

+1

これはこのメソッドとこのクラスのちょうど良いコードです。一般的には、より多くのチェックが必要です。 –

+0

'Where'から 'Single'にチェックを折りたたんでもいいかもしれません。つまり、m => m.Name =="含まれています "&& m.GetParameters()。Length == 2' – dasblinkenlight

+0

@dasblinkenlight:私は個人的に見つけましたこの形式でより読みやすくなります。チェックインすることができます。これは私がそれについて考えているところに近いです。すべてのContainsメソッドを見つけてから、適切な数のパラメータを持つメソッドを見つけてください。 –

関連する問題