Отражение: как вызвать метод с параметрами

Я пытаюсь вызвать метод через reflection с параметрами, и я получаю:

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

Если я вызываю метод без параметров, он работает нормально. На основании следующего кода, если я вызываю метод 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); } } } } } 

7 Solutions collect form web for “Отражение: как вызвать метод с параметрами”

Измените «methodInfo» на «classInstance», как и в вызове с нулевым массивом параметров.

  result = methodInfo.Invoke(classInstance, parametersArray); 

У вас есть ошибка прямо там

 result = methodInfo.Invoke(methodInfo, parametersArray); 

должен быть

 result = methodInfo.Invoke(classInstance, parametersArray); 

Основная ошибка здесь:

 result = methodInfo.Invoke(methodInfo, parametersArray); 

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

 result = methodInfo.Invoke(classInstance, parametersArray); 

Предоставленное решение не работает для экземпляров типов, загружаемых с удаленной сборки. Чтобы сделать это, вот решение, которое работает во всех ситуациях, которое включает явное переназначение типа типа, возвращаемого вызовом CreateInstance.

Вот как мне нужно создать свой classInstance, поскольку он был расположен в удаленной сборке.

 // sample of my CreateInstance call with an explicit assembly reference object classInstance = Activator.CreateInstance(assemblyName, type.FullName); 

Однако даже с предоставленным выше ответом вы все равно получите ту же ошибку. Вот как это сделать:

 // first, create a handle instead of the actual object ObjectHandle classInstanceHandle = Activator.CreateInstance(assemblyName, type.FullName); // unwrap the real slim-shady object classInstance = classInstanceHandle.Unwrap(); // re-map the type to that of the object we retrieved type = classInstace.GetType(); 

Затем сделайте так, как другие пользователи упомянули здесь.

Я бы использовал его так, его путь короче, и он не даст никаких проблем

  dynamic result = null; if (methodInfo != null) { ParameterInfo[] parameters = methodInfo.GetParameters(); object classInstance = Activator.CreateInstance(type, null); result = methodInfo.Invoke(classInstance, parameters.Length == 0 ? null : parametersArray); } 

Я попытался работать со всеми предложенными ответами выше, но для меня ничего не работает. Поэтому я пытаюсь объяснить, что сработало для меня здесь.

Я считаю, что если вы вызываете какой-либо метод, например Main ниже или даже с одним параметром, как в вашем вопросе, вам просто нужно изменить тип параметра из string в object чтобы это работало

 class Class1 { public static void Execute(object[] str) {...} } 

Затем вы должны передать параметрArray внутри массива объектов, как показано ниже, при его вызове.

 Assembly assembly = Assembly.LoadFile("...Assembly1.dll"); Type type = assembly.GetType("TestAssembly.Main"); if (type != null) { MethodInfo mi = typeInstance.GetType().GetMethod("Execute"); ParameterInfo[] parameters = mi.GetParameters(); object classInstance = Activator.CreateInstance(typeInstance.GetType(), null); if (parameters.Length == 0) { // This works fine var result = mi.Invoke(classInstance, null); } else { object[] parametersArray = new object[] { "Hello","bye" }; var result = mi.Invoke(classInstance,new object[] { parametersArray } ); } } 

Надеюсь это поможет

  Assembly assembly = Assembly.LoadFile(@"....bin\Debug\TestCases.dll"); //get all types var testTypes = from t in assembly.GetTypes() let attributes = t.GetCustomAttributes(typeof(NUnit.Framework.TestFixtureAttribute), true) where attributes != null && attributes.Length > 0 orderby t.Name select t; foreach (var type in testTypes) { //get test method in types. var testMethods = from m in type.GetMethods() let attributes = m.GetCustomAttributes(typeof(NUnit.Framework.TestAttribute), true) where attributes != null && attributes.Length > 0 orderby m.Name select m; foreach (var method in testMethods) { MethodInfo methodInfo = type.GetMethod(method.Name); 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(classInstance, parametersArray); } } } } 
  • MySqlCommand Command.Parameters.Add устарел
  • Лучшая практика сохранения настроек приложения в приложении Windows Forms
  • В чем разница между «$ @» и «$ *» в Bash?
  • Какова цель статического ключевого слова в параметре массива функции типа «char s »?
  • Значение, переданное с request.setAttribute (), недоступно request.getParameter ()
  • Параметр, проходящий в C - указатели, адреса, псевдонимы
  • Чтобы передать параметр прослушивателю событий в AS3 простым способом ... он существует?
  • Использование ключевого слова «this» в формальных параметрах для статических методов в C #
  • Каковы параметры Xms и Xmx при запуске JVM?
  • Как вы запускаете .exe с параметрами с помощью оболочки vba ()?
  • «Параметр» против «Аргумент»
  • Interesting Posts

    Несколько мониторов (3) в ноутбуке с использованием порта HDMI и vga, только с графической картой

    Имеет ли смысл использовать «как» вместо броска, даже если нет нулевой проверки?

    Выбрать элемент по точному соответствию его содержимому

    Реестр Windows – почему (и где) это существует?

    Переместить таблицу в стиле матрицы в 3 столбца в Excel

    Различные результаты с плавающей запятой с включенной оптимизацией – ошибка компилятора?

    Unity – нужно вернуть значение только после завершения coroutine

    Отправка сообщения в ноль в Objective-C

    Microsoft Security Essentials 2.0 удалил себя без меня, ничего не делая

    Как остановить Firefox на SSD от замерзания при использовании окна поиска или отправки формы?

    Есть ли способ вернуть ссылку на переменную, созданную в функции?

    Получение пути к сценарию R

    R передать переменные столбцы в ggplot2

    Как замедлить скорость моего Wi-Fi в Thomson Speedtouch

    Игнорировать предупреждения Xcode при использовании Cocoapods

    Давайте будем гением компьютера.