none
Enumerableの拡張メソッドをGetMethodしたい

    質問

  • Genericを含むメソッドはGetMethodするのは記述的が難しいです。
    public static int Sum<TSource>(
    	this IEnumerable<TSource> source,
    	Func<TSource, int> selector
    )
    これをGetMethodするにはどのように書けばよろしいのでしょうか?
    typeof(Enumerable).GetMethod("Sum",new Type[]{typeof(IEnumerable).MakeGenericType(typeof(.....
    MakeGenericTypeを使うと具体的な型パラメータを指定することになります。
    そうではなくパラメータ指定前のMethodInfoを取得したいのですがどう書けばよいのでしょうか?

    2009年12月3日 0:00

回答

すべての返信

  • >そうではなくパラメータ指定前のMethodInfoを取得したいのですがどう書けばよいのでしょうか?

    メソッドとしての実体がないんじゃなかったでしたっけ?
    2009年12月3日 1:57
  • メソッドとしての実体がないんじゃなかったでしたっけ?
    Invoke はできませんが、MethodInfo の取得だけならできます。
    // オーバーロードがある場合の GetMethod での取得方法は知りませんけど。
    2009年12月3日 2:11
  • var method = typeof( Enumerable )
      .GetMethods( BindingFlags.Public|BindingFlags.Static )
      .Single( m => m.Name == "Sum" && m.ReturnType == typeof( int ) && m.GetParameters().Length == 2 );
    Console.WriteLine( method );

    すごく後ろ向きですが、ふるい分けてしまえばいいのでは、と思います。
    2009年12月3日 2:39
  • MakeGenericType() しなければよいだけです。
    typeof(Enumerable).GetMethod("Count", typeof(IEnumerable)); など。
    呼び出すためには、具体的な型をバインドしてから Invoke することになります。


    2009年12月3日 2:43
  • // オーバーロードがある場合の GetMethod での取得方法は知りませんけど。
    まさにこれが問題になっています。
    2009年12月3日 5:53
  • 現状仰るとおりGetMethds()で取得したメソッドから探す方法で対処しています。
    • 回答としてマーク 和和和 2009年12月30日 6:24
    2009年12月3日 5:56
  • 今更な指摘ですが、気付いたので、コメントさせていただきます。

    .NETでは、以下のメソッドを利用することを想定しているのではないでしょうか?

    Type.FindMembers メソッド
    http://msdn.microsoft.com/ja-jp/library/system.type.findmembers.aspx
    2010年1月25日 10:29
  • 今更な指摘ですが、気付いたので、コメントさせていただきます。

    .NETでは、以下のメソッドを利用することを想定しているのではないでしょうか?

    Type.FindMembers メソッド
    http://msdn.microsoft.com/ja-jp/library/system.type.findmembers.aspx

    これを使うことで自作コードが減ってよりよくなると思います。
    ありがとうございました。
    2010年1月27日 3:53