2009-10-26 9 views
6

私はこのジェネリックメソッドのMethodInfoを非ジェネリック型に戻すために、どの引数をType.GetMethodに渡すべきかを理解できません。 は具体的に、私はこのタイプの定義を持っている:私はいくつかを試してみましたジェネリックメソッドのMethodInfoを非汎用.NETタイプで取得するにはどうすればよいですか?

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に興味があります。

アイデア?

ありがとうございました。

EDIT

は実は、私のコードは、もう少し複雑です。ジェネリックメソッドはオーバーロードされているので、関数名だけで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) 
+0

あなたが試したコードを投稿してください。 –

+0

私の質問が変更されました。ありがとう。 – mark

+0

@マーク私は自分の答えを変えました。 –

答えて

6

問題は、あなたがGetMethodに渡しているIEnumerable<>パラメータは、専門ではないということです。実際にはIEnumerable<T>で、取得しようとしている方法でTが指定されています。しかし、TからMethodInfo.GetGenericArguments()を取得することはできません。メソッドへの参照がないため、取得しようとしています。

残念ながら、これは反射APIが不足している場所です。 Type.GetMethod()オーバーロードがないため、オーバーロードされたメソッドを区別することができます。オーバーロードされたメソッドは、汎用メソッドです。

したがって、あなたはType.GetMethods()を使用して止まっており、選択した述語で結果をフィルタリングします。興味のあるメソッドを取得するには、次の操作を行います。

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

N.B.私はGetGenericTypeDefinition()コールが必要であることを確認していません。あなたはそれを省略することができるかもしれません。考え方は、タイプA<T>A<>に変換していますが、ランタイムはすでにそのフォームでそれを与えるかもしれません。

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つしかないと仮定 - あなたは1以上を追加する場合、これは少しより堅牢にする必要がある)の一般的なパラメータを持つメソッドを探すゲット
  3. 取得ジェネリックMETHODINFO
+1

ありがとうございました。しかし、私は質問ではじめて誤解しました。私はそれをより正確に変更しました。 – mark

+0

ありがとうございます、しかし、私は私の質問で私はGetMethodsまたはFindMemberでそれを行う方法を知っていることを言及。私はGetMethodに特に関心があります。なぜなら、それは仕事もやるべきだからですが、そうではなく、それは私を悩ますものです。 – mark

+0

@マークそれを行う方法はありません。メソッドを定義するための一般的なデータは、検査するメソッドがなければ使用できないためです。 –

関連する問題