Отражение: Как Вызвать Method с параметрами

Я пытаюсь вызвать метод через отражение с параметрами, и я добираюсь:

объект не соответствует целевому типу

Если я вызываю метод без параметров, он хорошо работает. На основе следующего кода, если я называю метод 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);
                }
            }
        }
    }
}
186
задан Mateen Ulhaq 18 March 2016 в 08:23
поделиться

3 ответа

Маловероятно, что проблема связана с датой отправки ошибки, но вы также увидите что-то подобное, если вы используете пример кода 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);
222
ответ дан 23 November 2019 в 05:50
поделиться

Здесь фундаментальная ошибка:

result = methodInfo.Invoke(methodInfo, parametersArray); 

Вы вызываете метод для экземпляра MethodInfo . Вам необходимо передать экземпляр того типа объекта, который вы хотите вызвать.

result = methodInfo.Invoke(classInstance, parametersArray);
23
ответ дан 23 November 2019 в 05:50
поделиться

У вас тут ошибка

result = methodInfo.Invoke(methodInfo, parametersArray);

, она должна быть

result = methodInfo.Invoke(classInstance, parametersArray);
28
ответ дан 23 November 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: