4

Expression特定のジェネリック オーバーロード メソッドを呼び出すを作成しようとしています (Enumerable.Average最初のテスト ケースで)。ただし、特定の型のバインディングは実行時までわからないReflectionため、正しいジェネリック メソッドを見つけて作成する必要があります (Expression解析されたテキストから作成されます)。

したがって、実行時にこの特定のオーバーロードを見つけたいことがわかっている場合:

public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)

MethodInfoリフレクションを使用してその特定を解決するにはどうすればよいですか?

これまでのところ、次の選択ステートメントがあります。

MethodInfo GetMethod(Type argType, Type returnType)
{
    var methods = from method in typeof(Enumerable).GetMethods(BindingFlags.Public | BindingFlags.Static)
      where method.Name == "Average" &&
      method.ContainsGenericParameters &&                              
      method.GetParameters().Length == 2 &&
      // and some condition where method.GetParameters()[1] is a Func that returns type argType
      method.ReturnType == returnType
      select method;

      Debug.Assert(methods.Count() == 1);
      return methods.FirstOrDefault();
}

上記は 3 つのオーバーロードに絞り込みますが、Func<TSource, int>whereを取る特定のオーバーロードを反映して見つけたいと思いますargType == typeof(int)

私は困惑しており、どんな助けも大歓迎です。

4

4 に答える 4

1

直接実行するのではなく式を作成しているので、MethodInfo の手順をスキップして、MethodInfo ではなくメソッド名を取る Expression.Call オーバーロードを使用して直接 MethodCallExpression に進むことができます。

var call = Expression.Call(typeof(Enumerable),
             "Average",
            new Type[] { typeof(MyTSource) },
            enumerableParameter, lambdaParameter
                );
于 2009-09-23T13:04:19.077 に答える
1

方法は次のとおりです。

static MethodInfo GetMethod(Type argType, Type returnType)
{
    var methods = from m in typeof(Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public)
                  where m.ContainsGenericParameters
                  && m.Name == "Average"
                  && m.GetParameters()[1].ParameterType.GetGenericTypeDefinition() == typeof(Func<,>)
                  && m.GetParameters()[1].ParameterType.GetGenericArguments()[1] == returnType
                  select m;
    return methods.First();
}
于 2009-09-23T13:22:39.433 に答える