8

非ジェネリック型のジェネリック メソッドの MethodInfo を取得するために、どの引数を Type.GetMethod に渡すかがわからないという小さな問題があります。具体的には、次の型定義があります。

public static class A
{
  public static B F<T>(bool dummy)
  {
  }
  public static B F<T>(IEnumerable<T> arg)
  {
  ...
  }
}

Type.GetMethod でいくつか試してみましたが、F メソッドの MethodInfo を返すものはありませんでした。

Type.GetMethods または Type.FindMember を呼び出すことができることは承知していますが、Type.GetMethod に興味があります。

何か案は?

ありがとう。

編集

実際、私のコードはもう少し複雑です。ジェネリック メソッドはオーバーロードされているため、Type.GetMethod を関数名だけで使用することはできません。私はこれらの変種を試しました:

typeof(A).GetMethod("F", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F`1", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F[T]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
typeof(A).GetMethod("F[[T]]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null)
4

2 に答える 2

9

問題は、IEnumerable<>渡すパラメーターがGetMethod特殊化されていないことです。それは実際には、IEnumerable<T>取得Tしようとしているメソッドによって指定された です。しかし、メソッドへの参照がないため、T経由できませんMethodInfo.GetGenericArguments()。まだ取得しようとしています。

残念ながら、これがリフレクション API の不十分なところです。Type.GetMethod()オーバーロードされたメソッドを区別できるようにするオーバーロードはありません。1 つはジェネリック メソッドです。

そうは言ってもType.GetMethods()、選択した述語を使用して結果をフィルタリングすることに行き詰まっています。興味のあるメソッドを取得するには、次のようにします。

void getMethod()
{
    typeof(A).GetMethods().Where(m =>
        m.IsGenericMethod &&
        m.GetParameters()[0].ParameterType.GetGenericTypeDefinition()
            == typeof(IEnumerable<>));
}

NBGetGenericTypeDefinition()呼び出しが必要であることを確認していません。省略できる場合があります。A<T>型を に変換するという考え方ですA<>が、ランタイムはすでにその形式でそれを提供している可能性があります。

于 2009-10-26T14:19:50.193 に答える
5

(質問の明確化に応じて更新):

GetMethodメソッドを定義するための一般的なデータは、検査するメソッドを取得するまで利用できないため、(たとえば、1 行)を使用してメソッドへのハンドルを取得する方法はありません。

MethodInfo[] methods = typeof(A).GetMethods(BindingFlags.Static | BindingFlags.Public);
MethodInfo genericMethod = methods.Where(m=>m.IsGenericMethod).First(m=>m.ContainsGenericParameters);
genericMethod = genericMethod.GetGenericMethodDefinition();
  1. メソッドを取得する
  2. ジェネリック パラメータを持つメソッドを見つけます (パラメータが 1 つしかないと仮定します。複数追加する場合は、もう少し堅牢にする必要があります)。
  3. ジェネリック メソッド情報を取得する
于 2009-10-26T13:36:52.447 に答える