Selecione o método genérico correto com reflexão
Quero selecionar o método genérico correto via reflexão e depois chamá-lo.
Geralmente isso é bem fácil. Por exemplo
var method = typeof(MyType).GetMethod("TheMethod");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
No entanto, o problema começa quando há diferentes sobrecargas genéricas do método. Por exemplo, os métodos estáticos na classe System.Linq.Queryable. Existem duas definições do método 'Where'
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T,bool>> predicate)
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T,int,bool>> predicate)
Isso significa que GetMethod não funciona, porque não pode distinguir os dois. Portanto, eu quero selecionar o caminho certo.
Até agora, muitas vezes eu apenas segui o primeiro ou o segundo método, dependendo da minha necessidade. Como isso:
var method = typeof (Queryable).GetMethods().First(m => m.Name == "Where");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
No entanto, não estou feliz com isso, porque assumo que o primeiro método é o correto. Prefiro encontrar o método certo pelo tipo de argumento. Mas não consegui descobrir como.
Eu tentei passar os 'tipos', mas não funcionou.
var method = typeof (Queryable).GetMethod(
"Where", BindingFlags.Static,
null,
new Type[] {typeof (IQueryable<T>), typeof (Expression<Func<T, bool>>)},
null);
Então, alguém tem uma idéia de como posso encontrar o método genérico "certo" por meio de reflexão. Por exemplo, a versão correta do método 'Where' em t, a classe Queryable?