Получение метода из класса

112
02 ноября 2019, 09:40

Имеется строка запроса(ну или просто строка) ../<контроллер>/<метод>/ далее параметры через "/". С помощью этой строки нужно вызвать соответствующий метод из класса контроллера. Класс контроллера есть, проблема в получении метода и передаче ему параметров(и вообще, решаема ли это проблема и есть ли она?). Из строки запроса я могу получить название метода, следовательно, найти метод из контроллера по имени. Но методы могут иметь одинаковые имена, но разное кол-во и разные по типу параметры.

Суть проблемы: как найти метод по параметрам, если я не знаю их типа. Т.е. если вдруг есть методы с одинаковым именем и одинаковым кол-вом параметров, то как с помощью рефлексии получить нужный?

Answer 1

как найти метод по параметрам, если я не знаю их типа

Никак, потому что именно типами параметров и определяется нужная перегрузка. И при вызове метода передаваемые значения должны иметь правильные типы, а как их конвертировать в нужный тип, если он неизвестен? Так что, в любом случае, без определения типов параметров не обойтись.

Я вижу 2 варианта:

  1. Делать лексический анализ значений, извлечённых из строки, чтобы определить в какие типы они могут быть конвертированы (для каждого отдельного значения таких типов может быть несколько, например строку "50" можно конвертировать и в byte, и в int, и в double, и т. д.). А затем, определив все возможные наборы типов, искать метод с соответствующими параметрами.

  2. Сначала найти все методы (выбрав те варианты перегрузки, которые подходят по количеству параметров), затем для каждого из них получить типы его параметров, а затем пробовать конвертировать свои значения в эти типы. Тот метод, для которого удастся успешно конвертировать все значения в соответствующий набор типов и будет подходящим.

Answer 2

Класс контроллера есть, проблема в получении метода и передаче ему параметров(и вообще, решаема ли это проблема и есть ли она?).

вызов метода через рефлексию

Из строки запроса я могу получить название метода, следовательно, найти метод из контроллера по имени.

названия метода достаточно что бы вызывать его через рефлексию. Даже, если там есть перегруженные методы к этому методу.

Но методы могут иметь одинаковые имена, но разное кол-во и разные по типу параметры.

так и есть.

как найти метод по параметрам, если я не знаю их типа. Т.е. если вдруг есть методы с одинаковым именем и одинаковым кол-вом параметров, то как с помощью рефлексии получить нужный?

это задача рефлексии а не твоя. Твоя задача передать просто правильную последовательность параметров в правильном типе данных каждый параметр. Все остальное сделает шарп.

в той строке которую ты принимаешь -- присылай себе строку вида

./<контроллер>/<метод>/типПараметра:значение&типПараметра:значение&.....

и, снова таки, через рефлексию ты будешь приводить в нужный формат данных строку.

READ ALSO
Привязка данных к DatePicker WPF

Привязка данных к DatePicker WPF

Возникла проблема с форматами при привязке данных к DatePickerНеобходимо отображать дату в формате dd

131
Получение имени сервера по IP

Получение имени сервера по IP

С толкнулся с такой проблемой, что метод не может получить имя сервера по IPДля некоторых серверов это работает, а для некоторых нет

119
OpenCV: размыть края изображения

OpenCV: размыть края изображения

Как можно такое размытие реализовать? Пока только получается как на метки "My Output"

127
как настроить фильтр для столбаца в excel через c#, возможно ли использовать для этого какую либо систему?

как настроить фильтр для столбаца в excel через c#, возможно ли использовать для этого какую либо систему?

В архиве на стеллажах хранятся коробки с документамиКаждый стеллаж имеет свой штрих-код – Sххххх, где х – цифра от 0 до 9 Каждая полка на стеллажах...

111