J'essaie d'invoquer une méthode via la réflexion avec des paramètres et j'obtiens:
l'objet ne correspond pas au type cible
Si j'appelle une méthode sans paramètres, cela fonctionne très bien. Basé sur le code suivant si j'appelle la méthode Test("TestNoParameters")
, cela fonctionne très bien. Cependant, si j'appelle Test("Run")
, je reçois une exception. Quelque chose ne va pas avec mon code?
Mon objectif initial était de passer un tableau d'objets, par exemple public void Run(object[] options)
mais cela n'a pas fonctionné et j'ai essayé quelque chose de plus simple, par exemple une chaîne sans succès.
// 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
la source
la source
Réponses:
Remplacez "methodInfo" par "classInstance", tout comme dans l'appel avec le tableau de paramètres null.
la source
Vous avez un bug ici
ça devrait être
la source
Une erreur fondamentale est ici:
Vous appelez la méthode sur une instance de
MethodInfo
. Vous devez transmettre une instance du type d'objet que vous souhaitez invoquer.la source
La solution fournie ne fonctionne pas pour les instances de types chargées à partir d'un assembly distant. Pour ce faire, voici une solution qui fonctionne dans toutes les situations, ce qui implique un re-mappage de type explicite du type renvoyé via l'appel CreateInstance.
C'est ainsi que je dois créer mon classInstance, car il était situé dans un assembly distant.
Cependant, même avec la réponse fournie ci-dessus, vous obtiendriez toujours la même erreur. Voici comment s'y prendre:
Ensuite, faites comme les autres utilisateurs mentionnés ici.
la source
Je l'utiliserais comme ça, son chemin est plus court et cela ne posera aucun problème
la source
la source
J'ai essayé de travailler avec toutes les réponses suggérées ci-dessus mais rien ne semble fonctionner pour moi. J'essaie donc d'expliquer ce qui a fonctionné pour moi ici.
Je crois que si vous appelez une méthode comme la
Main
ci - dessous ou même avec un seul paramètre comme dans votre question, il vous suffit de changer le type de paramètre destring
àobject
pour que cela fonctionne. J'ai une classe comme ci-dessousEnsuite, vous devez passer le paramètreArray à l'intérieur d'un tableau d'objets comme ci-dessous tout en l'invoquant. La méthode suivante est ce dont vous avez besoin pour travailler
Cette méthode permet d'appeler facilement la méthode, elle peut être appelée comme suit
la source
J'invoque la moyenne pondérée par réflexion. Et avait utilisé la méthode avec plus d'un paramètre.
la source
s'il n'est pas externe .dll (au lieu de
this.GetType()
, vous pouvez utilisertypeof(YourClass)
).ps poster cette réponse car de nombreux visiteurs entrent ici pour cette réponse.
la source