Я пытаюсь создать 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();
}
Вышеизложенное сужает его до трех перегрузок, но я хочу подумать и найти конкретную перегрузку, которая принимает Func<TSource, int>, где argType == typeof(int).
Я в тупике, и любая помощь приветствуется.