Как вызвать метод, используя 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 ответа
В 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[] { });
Не пропустите MethodInfo
объект method
вызову invoke, но вместо этого объект, для которого вы хотите вызвать метод. Я не вижу предмет, на котором ты мог бы сделать это.
более того Invoke
имеет два параметра (см. MSDN). Так что синтаксическая ошибка, вероятно, в том, что вы забыли передать параметры.
Насколько я понимаю ваш код, у вас есть лист Excel, содержащий имена некоторых методов, которые вы хотите вызывать динамически. Правильно? Но вы не можете просто получить.NET Object из ячейки Excel.
Если вам нужен объект для вызова метода, вам нужно создать его и установить правильное состояние для его вызова. Таким образом, вы, возможно, могли бы добавить еще несколько данных в таблицу Excel и использовать их для настройки объекта.
Может быть, для будущего читателя, может использовать что-то вроде этого..
keyWordHolder program = new keyWordHolder();
MethodInfo[] methods = typeof(keyWordHolder).GetMethods();
foreach (MethodInfo meth in methods)
{
if (meth.Name == keywords)
{
meth.Invoke(program, null);
}