Как вызвать метод с помощью Reflection

for (int tsid = 1; tsid < controller.getRowCount(currentTest); tsid++)
{
    // values from xls
    keyword = controller.getCellData(currentTest, "Keyword", tsid);
    //object=controller.getCellData(currentTest, "Object", tsid);
    currentTSID = controller.getCellData(currentTest, "TSID", tsid);
    stepDescription = controller.getCellData(currentTest, "Description", tsid);

    Console.WriteLine("Keyword is:" + keyword);

    try
    {
        // --this is equivalent java code 
        //MethodInfo method= Keywords.class.getMethod(keyword);

        MethodInfo method= method.GetMethodBody(keyword);
        String result = (String)method.Invoke(method);

        if(!result.StartsWith("Fail")) {
            ReportUtil.addKeyword(stepDescription, keyword, result,null);
        }
    }
    catch (...) { ... }
}

Здесь из листа Excel мы читаем ключевое слово, и нам нужно вызвать этот конкретный метод с помощью Reflection:

MethodInfo method= method.GetMethodBody(keyword);
String result = (String)method.Invoke(method);

Но эти две строки кода вызывают у меня синтаксическую ошибку. Я использовал using System.Reflection; в верхней части файла, но ошибка сохраняется.


person Nilanjan Saha    schedule 04.01.2014    source источник
comment
MethodInfo method = method.GetMethodBody(keyword) не может работать, потому что вы используете method до его инициализации. Что вы пытаетесь сделать на этой линии?   -  person CodeCaster    schedule 04.01.2014
comment
-1: синтаксическая ошибка не является хорошим объяснением ошибки. Боковое примечание: если вы выберете сообщение об ошибке в Visual Studio и нажмете F1, вы получите более подробное объяснение ошибки от MSDN. Если вы все еще не понимаете ошибку, опубликуйте точное сообщение об ошибке (вместе с кодом ошибки, например CS0123 или ссылку на соответствующую статью MSDN).   -  person Alexei Levenkov    schedule 05.01.2014


Ответы (3)



Не передавайте MethodInfo Object method в вызов invoke, а вместо этого передайте объект, для которого вы хотите вызвать метод. Я не вижу предмет, на котором вы, вероятно, могли бы это сделать.

Кроме того, Invoke имеет два параметра (см. MSDN). Таким образом, синтаксическая ошибка, вероятно, заключается в том, что вы забыли передать параметры.

Насколько я понимаю ваш код, у вас есть лист Excel, содержащий имена некоторых методов, которые вы хотите вызывать динамически. Верно? Но вы не можете просто получить объект .NET из ячейки Excel.

Если вам нужен объект для вызова метода, вам нужно будет создать его и установить правильное состояние для его вызова. Так что вы, вероятно, могли бы добавить еще несколько данных в свой лист Excel и использовать их для настройки объекта.

person thuri    schedule 04.01.2014

Может быть, будущий читатель может использовать что-то вроде этого ..

keyWordHolder program = new keyWordHolder();
MethodInfo[] methods = typeof(keyWordHolder).GetMethods();
foreach (MethodInfo meth in methods)
 {
   if (meth.Name == keywords)
      {
          meth.Invoke(program, null); 
       }   
person Aniish    schedule 20.04.2015