Выберите правильный общий метод с отражением
Я хочу выбрать правильный обобщенный метод с помощью отражения, а затем вызвать его.
Обычно это довольно просто. Например
var method = typeof(MyType).GetMethod("TheMethod");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
Однако проблема начинается, когда есть различные общие перегрузки метода. Например, статические методы в классе System.Linq.Queryable. Есть два определения метода «Где»
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)
Это означает, что GetMethod не работает, потому что он не может их описать. Поэтому я хочу выбрать правильный.
До сих пор я часто использовал первый или второй метод, в зависимости от моих потребностей. Как это:
var method = typeof (Queryable).GetMethods().First(m => m.Name == "Where");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
Однако я не доволен этим, потому что я делаю огромное предположение, что первый метод является правильным. Я скорее хочу найти правильный метод по типу аргумента. Но я не мог понять, как.
Я попробовал это с передачей «типов», но это не сработало.
var method = typeof (Queryable).GetMethod(
"Where", BindingFlags.Static,
null,
new Type[] {typeof (IQueryable<T>), typeof (Expression<Func<T, bool>>)},
null);
Так что кто-нибудь знает, как я могу найти «правильный» универсальный метод с помощью рефлексии. Например, правильная версия метода «Где» для t, он Queryable-класса?