Estoy tratando de invocar un método mediante reflexión con parámetros y obtengo:
el objeto no coincide con el tipo de destino
Si invoco un método sin parámetros, funciona bien. Basado en el siguiente código si llamo al método Test("TestNoParameters")
, funciona bien. Sin embargo, si llamo Test("Run")
, recibo una excepción. ¿Hay algún problema con mi código?
Mi propósito inicial era pasar una serie de objetos, por ejemplo, public void Run(object[] options)
pero esto no funcionó y probé algo más simple, por ejemplo, una cadena sin éxito.
// 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
fuente
fuente
Respuestas:
Cambie "methodInfo" a "classInstance", al igual que en la llamada con la matriz de parámetros nulos.
fuente
Tienes un error ahí mismo
debería ser
fuente
Un error fundamental está aquí:
Estás invocando el método en una instancia de
MethodInfo
. Debe pasar una instancia del tipo de objeto sobre el que desea invocar.fuente
La solución proporcionada no funciona para instancias de tipos cargados desde un ensamblaje remoto. Para hacer eso, aquí hay una solución que funciona en todas las situaciones, que implica una reasignación de tipo explícito del tipo devuelto a través de la llamada CreateInstance.
Así es como necesito crear mi classInstance, ya que se encuentra en un ensamblado remoto.
Sin embargo, incluso con la respuesta proporcionada anteriormente, aún obtendría el mismo error. Aquí es cómo hacerlo:
Luego haz lo que los otros usuarios mencionados aquí.
fuente
Lo usaría así, es mucho más corto y no dará ningún problema
fuente
fuente
Traté de trabajar con todas las respuestas sugeridas anteriormente, pero nada parece funcionar para mí. Así que estoy tratando de explicar lo que funcionó para mí aquí.
Creo que si está llamando a algún método como el
Main
siguiente o incluso con un solo parámetro como en su pregunta, solo tiene que cambiar el tipo de parámetro destring
aobject
para que esto funcione. Tengo una clase como abajoLuego debe pasar el parámetroArray dentro de una matriz de objetos como a continuación mientras lo invoca. El siguiente método es lo que necesita para trabajar.
Este método facilita la invocación del método, se puede llamar de la siguiente manera
fuente
Invoco el promedio ponderado a través de la reflexión. Y había utilizado el método con más de un parámetro.
fuente
si no es .dll externo (en lugar de
this.GetType()
, puede usartypeof(YourClass)
).ps publicando esta respuesta porque muchos visitantes ingresan aquí para esta respuesta.
fuente