Estou tentando invocar um método via reflexão com parâmetros e recebo:
objeto não corresponde ao tipo de destino
Se eu invocar um método sem parâmetros, ele funcionará bem. Com base no código a seguir, se eu chamar o método Test("TestNoParameters")
, ele funciona bem. No entanto, se eu ligar Test("Run")
, recebo uma exceção. Há algo de errado com o meu código?
Meu objetivo inicial era passar uma matriz de objetos, por exemplo, public void Run(object[] options)
mas isso não funcionou e eu tentei algo mais simples, por exemplo, string sem sucesso.
// 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
Ioannis
fonte
fonte
Respostas:
Altere "methodInfo" para "classInstance", assim como na chamada com a matriz de parâmetros nulos.
fonte
Você tem um bug aí
deveria ser
fonte
Um erro fundamental está aqui:
Você está chamando o método em uma instância de
MethodInfo
. Você precisa passar em uma instância do tipo de objeto que deseja chamar.fonte
A solução fornecida não funciona para instâncias de tipos carregados de um assembly remoto. Para fazer isso, aqui está uma solução que funciona em todas as situações, que envolve um mapeamento explícito de tipo do tipo retornado pela chamada CreateInstance.
É assim que preciso criar meu classInstance, pois ele estava localizado em um assembly remoto.
No entanto, mesmo com a resposta fornecida acima, você ainda receberá o mesmo erro. Aqui está como proceder:
Em seguida, faça como os outros usuários mencionados aqui.
fonte
Eu usaria assim, é bem mais curto e não dará problemas
fonte
fonte
Tentei trabalhar com todas as respostas sugeridas acima, mas nada parece funcionar para mim. Então, eu estou tentando explicar o que funcionou para mim aqui.
Acredito que se você está chamando algum método como o
Main
abaixo ou mesmo com um único parâmetro, como na sua pergunta, basta alterar o tipo de parâmetro destring
paraobject
para que isso funcione. Eu tenho uma aula como abaixoEntão você deve passar o parameterArray dentro de uma matriz de objetos como abaixo, enquanto o chama. O método a seguir é o que você precisa para trabalhar
Esse método facilita a chamada do método, pode ser chamado da seguinte maneira
fonte
Estou invocando a média ponderada através da reflexão. E tinha usado o método com mais de um parâmetro.
fonte
se não for .dll externo (em vez de
this.GetType()
, você pode usartypeof(YourClass)
).ps postando esta resposta porque muitos visitantes entram aqui para esta resposta.
fonte