Reflektion: Wie Methode mit Parametern aufgerufen wird
Ich versuche eine Methode aufzurufen, die Sie über reflektion mit Parametern und ich bekomme:
Objekt nicht mit Zieltyp
Wenn ich das aufrufen einer Methode ohne Parameter funktioniert es einwandfrei. Basierend auf den folgenden code, wenn ich die Methode aufrufen Test("TestNoParameters")
es funktioniert gut. Jedoch wenn ich den Anruf Test("Run")
ich eine Ausnahme. Ist etwas falsch mit meinem code?
Meine anfängliche Zweck war die übergabe eines Arrays von Objekten z.B. public void Run(object[] options)
aber das hat nicht funktioniert und ich habe versucht etwas einfacher, z.B. string, ohne Erfolg.
//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);
}
}
}
}
}
Kommentare dem Thema
die korrekte Zeile wäre, object[] parametersArray = new object[] { new object[] { "Hallo" } };
InformationsquelleAutor der Frage Ioannis | 2010-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ändern "methodInfo" zu "classInstance", wie im Aufruf mit dem parameter null array.
InformationsquelleAutor der Antwort womp
Haben Sie einen Fehler genau dort
sollte es
InformationsquelleAutor der Antwort Oleg I.
Ein grundlegender Fehler ist hier:
Werden Sie den Aufruf der Methode auf eine Instanz der
MethodInfo
. Sie müssen pass, die in einer Instanz des Typs der Objekte, die Sie aufrufen möchten, auf.InformationsquelleAutor der Antwort jason
Die bereitgestellte Lösung funktioniert nicht für Instanzen von Typen geladen von einem remote-Montage. Um das zu tun, hier ist eine Lösung, die funktioniert in allen Situationen, die mit einer expliziten Typ re-mapping des Typs zurückgegeben durch die CreateInstance-Aufruf.
Dies ist, wie ich brauche, um meine classInstance, wie es sich in einem remote-Montage.
Allerdings auch mit der Antwort oben würde Sie immer noch die gleichen Fehler. Hier ist, wie das geht:
Dann machen Sie es wie die anderen Benutzer hier erwähnt.
InformationsquelleAutor der Antwort Martin Kool
Ich würde es so zu benutzen, seinen Weg kürzer und wird es nicht geben keine Probleme
InformationsquelleAutor der Antwort Nick N.
InformationsquelleAutor der Antwort M Fatih Koca
Ich versucht alle vorgeschlagenen Antworten oben, aber nichts scheint zu funktionieren für mich. Also ich versuche zu erklären, was für mich gearbeitet hier.
Ich glaube, wenn Sie den Aufruf einer bestimmten Methode wie die
Main
unten oder auch mit einem einzelnen parameter, wie in Ihrer Frage, die Sie gerade haben, ändern Sie den Parametertyp ausstring
zuobject
für diese ArbeitDann müssen Sie das parameterArray in einem Objekt-array wie unten, während die Berufung auf Sie.
Hoffe, das hilft
InformationsquelleAutor der Antwort Vinod Srivastav