Избегайте исключения AmbiguousMethod, но GetMethod возвращает null даже с добавленным списком параметров - PullRequest
1 голос
/ 07 мая 2020

Этот вопрос задавался раньше, но я не могу понять его для своего случая.

Я получаю null из следующего кода:

typeof(SettingsController)
    .GetMethod("GetById", new[] { typeof(Guid?), typeof(IValidator<>), typeof(HttpStatusCode) });

Мне нужно передать параметр list, потому что у меня есть два метода с одинаковым именем в классе base SettingsController:

public T GetById<T>(Guid? id, IValidator<T> validator, HttpStatusCode statusCode = HttpStatusCode.OK)

public T GetById<T>(Guid? id, string route, IValidator<T> validator, HttpStatusCode statusCode = HttpStatusCode.OK)

Что мне не хватает?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Самый простой способ получить спецификатор c MethodInfo для одного метода при наличии нескольких перегрузок с разными ограничениями - это создать новый делегат с соответствующей подписью;

var method = new Func<Guid?, IValidator<object>, HttpStatusCode,object>(((SettingsController)null).GetById).Method;

Это особенно полезно, когда существует много похожих методов. Например, платформа do tnet использует этот метод , чтобы различать guish между множеством похожих перегрузок IQueryable.

1 голос
/ 07 мая 2020

Вот что я нашел, надеюсь, это поможет вам копать дальше:

var unspecificMethodType = typeof(Program).GetMethod("GetById", new[] { typeof(Guid?), typeof(IValidator<>), typeof(HttpStatusCode) });
unspecificMethodType.Dump(); // null

var method = typeof(Program).GetMethods()
                            .Where(m => m.Name == "GetById")
                            .First();
var methodGenericType = method.GetGenericArguments()[0];
methodGenericType.Dump(); // T

var specificMethodType = typeof(Program).GetMethod("GetById", new[] { typeof(Guid?), typeof(IValidator<>).MakeGenericType(methodGenericType), typeof(HttpStatusCode) });
specificMethodType.Dump(); // GetById (Guid? id, IValidator<T> validator, HttpStatusCode statusCode

Из того, что я вижу, проблема может быть выделена этим тестом:

var paramType = method.GetParameters()[1].ParameterType;
paramType.Dump(); // Program+IValidator`1[T]
(paramType == typeof(IValidator<>)).Dump(); // false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...