Я пытаюсь вызвать метод через отражение с параметрами, и я получаю:
объект не соответствует типу цели
Если я вызываю метод без параметров, он работает нормально. Исходя из следующего кода, если я вызываю метод 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);
}
}
}
}
}
c#
reflection
parameters
methods
invoke
Иоаннис
источник
источник
Ответы:
Измените "methodInfo" на "classInstance", как в вызове с массивом нулевых параметров.
источник
У вас есть ошибка прямо там
так должно быть
источник
Основная ошибка здесь:
Вы вызываете метод для экземпляра
MethodInfo
. Вам нужно передать экземпляр типа объекта, который вы хотите вызвать.источник
Предоставленное решение не работает для экземпляров типов, загруженных из удаленной сборки. Чтобы сделать это, вот решение, которое работает во всех ситуациях, которое включает в себя явное переопределение типа, возвращаемого через вызов CreateInstance.
Вот как мне нужно создать свой classInstance, так как он был расположен в удаленной сборке.
Однако даже с ответом, приведенным выше, вы все равно получите ту же ошибку. Вот как это сделать:
Затем сделайте так, как другие пользователи, упомянутые здесь.
источник
Я бы использовал его так, он короче, и это не доставит никаких проблем.
источник
источник
Я пытался работать со всеми предложенными ответами выше, но мне ничего не помогло. Поэтому я пытаюсь объяснить, что сработало для меня здесь.
Я считаю, что если вы вызываете какой-либо метод, подобный приведенному
Main
ниже, или даже с одним параметром, как в вашем вопросе, вам просто нужно изменить тип параметра сstring
наobject
на, чтобы это работало. У меня есть класс, как показано нижеЗатем вы должны передать параметр Array в массив объектов, как показано ниже, при его вызове. Следующий метод - это то, что вам нужно для работы
Этот метод облегчает вызов метода, его можно вызвать следующим образом
источник
Я вызываю средневзвешенное значение через отражение. И использовал метод с более чем одним параметром.
источник
если это не внешний .dll (вместо
this.GetType()
, вы можете использоватьtypeof(YourClass)
).ps публикует этот ответ, потому что многие посетители заходят сюда для этого ответа.
источник