Как вызвать метод с аргументами разных типов, используя отражение в C#

#c# #.net

#c# #.net

Вопрос:

Я пытаюсь вызвать функцию, которая принимает два параметра (логическое значение и строку), используя .ЧИСТОЕ отражение в C #. Однако со следующим кодом я получаю исключение:

 object[] paramList = new object[] { true, "Foo" };

Type wsType = typeof(MyWS);
MyWS inst = (MyWS)Activator.CreateInstance(wsType);
MethodInfo method = wsType.GetMethod(function);    // function = the name of the function to be called
method.Invoke(inst, paramList);
  

Это вызывает исключение ArrayTypeMismatchException («Попытка получить доступ к элементу как типу, несовместимому с массивом»).

Кажется, что paramList вызывает исключение, но я понятия не имею, почему?

Функция, которую я пытаюсь вызвать, будет выглядеть примерно так:

 public bool EnableSchedule(bool enable, string password)
{
    ...
}
  

Комментарии:

1. Убедитесь, что function переменная действительно содержит имя функции, которая принимает эти два параметра. Помимо этого, ваш код должен работать.

2. Массив может содержать элементы разных типов, особенно массив объектов. Лучше задокументируйте свой вопрос, покажите тип и метод, которые вы пытаетесь вызвать, и трассировку стека исключения.

3. Если вы не предоставите определение (или, по крайней мере, объявление) «функции», его рука, чтобы понять, что происходит не так. Неправильный порядок параметров? Возможно ли, что ваша функция получает (string, bool), а не (bool, string)?

4. Попробуйте добавить строку function = "EnableSchedule"; ниже paramList и запустить ее снова. И, как сказал @Hans, трассировка стека покажет вам, в чем проблема (бьюсь об заклад, вы просто вызываете неправильную функцию).

5. код выполняется без проблем, если тело метода похоже на «return true;». возможно, метод выдает исключение, а не этот код, который вы вставили

Ответ №1:

Не похоже, что в том, что вы делаете, что-то не так, если только проблема не заключается в «MyWS». Я предполагаю, что класс является общедоступным. Между тем, попробуйте добавить некоторые флаги привязки к GetMethod(), например

 wsType.GetMethod(function, BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance);