Ich versuche, eine Methode durch Reflektion mit Parametern aufzurufen und erhalte:
Objekt stimmt nicht mit Zieltyp überein
Wenn ich eine Methode ohne Parameter aufrufe, funktioniert sie einwandfrei. Basierend auf dem folgenden Code Test("TestNoParameters")
funktioniert es einwandfrei, wenn ich die Methode aufrufe. Wenn ich jedoch anrufe Test("Run")
, erhalte ich eine Ausnahme. Stimmt etwas mit meinem Code nicht?
Mein ursprünglicher Zweck war es, eine Reihe von Objekten zu übergeben, z. B. public void Run(object[] options)
aber dies funktionierte nicht und ich versuchte etwas Einfacheres, z. B. eine Zeichenfolge, 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);
}
}
}
}
}
c#
reflection
parameters
methods
invoke
Ioannis
quelle
quelle
Antworten:
Ändern Sie "methodInfo" in "classInstance", genau wie beim Aufruf mit dem Null-Parameter-Array.
quelle
Sie haben genau dort einen Fehler
es sollte sein
quelle
Ein grundlegender Fehler ist hier:
Sie rufen die Methode für eine Instanz von auf
MethodInfo
. Sie müssen eine Instanz des Objekttyps übergeben, für den Sie aufrufen möchten.quelle
Die bereitgestellte Lösung funktioniert nicht für Instanzen von Typen, die von einer Remote-Assembly geladen wurden. Zu diesem Zweck finden Sie hier eine Lösung, die in allen Situationen funktioniert. Dazu gehört eine explizite Neuzuordnung des Typs des Typs, der über den Aufruf von CreateInstance zurückgegeben wird.
Auf diese Weise muss ich meine classInstance erstellen, da sie sich in einer Remote-Assembly befand.
Selbst mit der oben angegebenen Antwort wird jedoch immer noch der gleiche Fehler angezeigt. So geht's:
Dann machen Sie es wie die anderen hier genannten Benutzer.
quelle
Ich würde es so benutzen, es ist viel kürzer und es wird keine Probleme geben
quelle
quelle
Ich habe versucht, mit allen oben vorgeschlagenen Antworten zu arbeiten, aber nichts scheint für mich zu funktionieren. Also versuche ich zu erklären, was hier für mich funktioniert hat.
Ich glaube, wenn Sie eine Methode wie die
Main
folgende oder sogar einen einzelnen Parameter wie in Ihrer Frage aufrufen , müssen Sie nur den Parametertyp vonstring
auf ändern ,object
damit dies funktioniert. Ich habe eine Klasse wie untenDann müssen Sie den ParameterArray in einem Objektarray wie unten übergeben, während Sie es aufrufen. Die folgende Methode ist das, was Sie zum Arbeiten benötigen
Diese Methode erleichtert das Aufrufen der Methode und kann wie folgt aufgerufen werden
quelle
Ich rufe den gewichteten Durchschnitt durch Reflexion auf. Und hatte Methode mit mehr als einem Parameter verwendet.
quelle
wenn es keine externe DLL ist (statt
this.GetType()
, könnten Sie verwendentypeof(YourClass)
).ps poste diese Antwort, weil viele Besucher hier für diese Antwort eingeben.
quelle