Работа с обобщениями и рефлексией может быть немного утомительной. Лучше всего (для простоты) использовать GetMethods
и фильтровать по тому, что вы ищете.
//Overly simplified
MethodInfo joinMethod = typeof(Queryable)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(m => m.Name == "Join" && m.GetParameters().Length == 5)
.First();
Учитывая, что MethodInfo
не вызывается в этот момент. Вам нужно сделать его общую версию, используя joinMethod.MakeGenericMethod(/*type array*/)
. В вашем случае вам нужно будет использовать 4 типа: TOuter, TInner, TKey, TResult.
var genericJoinMethod = joinMethod.MakeGenericMethod(new Type[]{your types here});
Теперь вы можете использовать genericJoinMethod
так, как вы ожидаете.
Насколько я знаю, это единственный способ сделать это, если вы не знаете типы во время компиляции.
EDIT
Учитывая ваш комментарий, я думаю, это должно выглядеть примерно так:
MethodInfo joinMethod = typeof(Queryable)
.GetMethods(BindingFlags.Static | BindingFlags.Public)
.Where(m => m.Name == "Join" && m.GetParameters().Length == 5)
.First();
var genericJoinMethod = joinMethod.MakeGenericMethod(typeof(TType), typeof(TType), JoinKeyType, typeof(TType));
result = genericJoinMethod.Invoke( result, new object[] { result, items, OuterKeySelector, InnerKeySelector, ResultSelector } );