Я пытаюсь вызвать метод через отражение с параметрами, и я добираюсь:
объект не соответствует целевому типу
Если я вызываю метод без параметров, он хорошо работает. На основе следующего кода, если я называю метод Test("TestNoParameters")
, это хорошо работает. Однако, если я звоню Test("Run")
, Я получаю исключение. Что-то не так с моим кодом?
Моя начальная цель состояла в том, чтобы передать массив объектов, например. public void Run(object[] options)
но это не работало, и я попробовал что-то более простое, например, строку без успеха.
// Assembly1.dll
namespace TestAssembly
{
public class Main
{
public void Run(string parameters)
{
// Do something...
}
public void TestNoParameters()
{
// Do something...
}
}
}
// Executing Assembly.exe
public class TestReflection
{
public void Test(string methodName)
{
Assembly assembly = Assembly.LoadFile("...Assembly1.dll");
Type type = assembly.GetType("TestAssembly.Main");
if (type != null)
{
MethodInfo methodInfo = type.GetMethod(methodName);
if (methodInfo != null)
{
object result = null;
ParameterInfo[] parameters = methodInfo.GetParameters();
object classInstance = Activator.CreateInstance(type, null);
if (parameters.Length == 0)
{
// This works fine
result = methodInfo.Invoke(classInstance, null);
}
else
{
object[] parametersArray = new object[] { "Hello" };
// The invoke does NOT work;
// it throws "Object does not match target type"
result = methodInfo.Invoke(methodInfo, parametersArray);
}
}
}
}
}
Маловероятно, что проблема связана с датой отправки ошибки, но вы также увидите что-то подобное, если вы используете пример кода Apple и работаете на устройстве с поддержкой ES 2.0, при удалении стека матриц из спецификации, хотя определения функций останутся видимыми компилятору, так как устройство также поддерживает ES 1.1.
-121--4749190-var disableLink = function(){ return false;};
$('a').bind('click', disableLink);
для восстановления:
$('a').unbind('click', dsiableLink);
-121--4106703- Измените «methodInfo» на «classInstance», как в вызове с массивом нулевых параметров.
result = methodInfo.Invoke(classInstance, parametersArray);
Здесь фундаментальная ошибка:
result = methodInfo.Invoke(methodInfo, parametersArray);
Вы вызываете метод для экземпляра MethodInfo
. Вам необходимо передать экземпляр того типа объекта, который вы хотите вызвать.
result = methodInfo.Invoke(classInstance, parametersArray);
У вас тут ошибка
result = methodInfo.Invoke(methodInfo, parametersArray);
, она должна быть
result = methodInfo.Invoke(classInstance, parametersArray);