如何使用Reflection调用方法

时间:2014-01-04 19:52:52

标签: c# selenium-webdriver system.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;,但错误仍然存​​在。

3 个答案:

答案 0 :(得分:1)

不要将MethodInfo对象method传递给调用调用,而是传递要调用该方法的对象。我看不到你可能会做的对象。

此外Invoke有两个参数(请参阅MSDN)。因此,语法错误可能是您忘记传递参数。

据我了解您的代码,您有一张Excel表格,其中包含您想要动态调用的一些方法名称。对? 但是你不能只从Excel单元格中获取.NET对象。

如果您需要一个对象来调用该方法,您需要创建一个并建立正确的状态来调用它。因此,您可以在Excel工作表中添加更多数据,并使用它来设置对象。

答案 1 :(得分:1)

在C#中,您不使用Type.class,而是使用typeof(Type)

您可以将其与GetMethod(string methodName)结合使用,以获得特定的MethodInfo,然后您可以Invoke(object instance, object[] parameters)。对于静态类object instance应为null

例如:

 typeof(Console).GetMethod("ReadLine").Invoke(null, new object[] { });

答案 2 :(得分:0)

可能是未来的读者,可以使用这样的东西..

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