Próbuję wywołać metodę poprzez odbicie z parametrami i otrzymuję:
obiekt nie pasuje do typu docelowego
Jeśli wywołam metodę bez parametrów, działa dobrze. Na podstawie następującego kodu, jeśli wywołam metodę Test("TestNoParameters")
, działa dobrze. Jednak jeśli zadzwonię Test("Run")
, otrzymam wyjątek. Czy coś jest nie tak z moim kodem?
Moim początkowym celem było przekazanie tablicy obiektów, public void Run(object[] options)
ale to nie zadziałało i próbowałem czegoś prostszego, np. Łańcucha bez powodzenia.
// 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
źródło
źródło
Odpowiedzi:
Zmień „methodInfo” na „classInstance”, tak jak w wywołaniu z tablicą parametrów zerowych.
źródło
Masz tam błąd
powinno być
źródło
Podstawowy błąd jest tutaj:
Wywołujesz metodę na instancji
MethodInfo
. Musisz przekazać instancję typu obiektu, który chcesz wywołać.źródło
Dostarczone rozwiązanie nie działa w przypadku instancji typów ładowanych ze zdalnego zestawu. Aby to zrobić, oto rozwiązanie, które działa we wszystkich sytuacjach, co obejmuje jawne ponowne mapowanie typu zwróconego przez wywołanie CreateInstance.
W ten sposób muszę utworzyć moją classInstance, ponieważ została ona umieszczona w zdalnym zestawie.
Jednak nawet przy powyższej odpowiedzi nadal pojawiałby się ten sam błąd. Oto jak to zrobić:
Następnie wykonaj czynności, o których wspominali inni użytkownicy.
źródło
Użyłbym go w ten sposób, jest o wiele krótszy i nie spowoduje żadnych problemów
źródło
źródło
Próbowałem pracować ze wszystkimi sugerowanymi odpowiedziami powyżej, ale wydaje mi się, że nic nie działa. Staram się więc wyjaśnić, co mi tu zadziałało.
Uważam, że jeśli wywołujesz jakąś metodę, jak
Main
poniżej, lub nawet z jednym parametrem, jak w swoim pytaniu, wystarczy zmienić typ parametru zstring
na,object
aby to zadziałało. Mam klasę jak poniżejNastępnie musisz przekazać parametrArray wewnątrz tablicy obiektów, jak poniżej, podczas jej wywoływania. Poniższa metoda jest tym, czego potrzebujesz do pracy
Ta metoda ułatwia wywołanie metody, można ją wywołać w następujący sposób
źródło
Przywołuję średnią ważoną poprzez odbicie. I zastosował metodę z więcej niż jednym parametrem.
źródło
jeśli nie jest to zewnętrzny plik .dll (zamiast tego
this.GetType()
możesz użyćtypeof(YourClass)
).ps publikuje tę odpowiedź, ponieważ wielu odwiedzających wchodzi tutaj w celu uzyskania tej odpowiedzi.
źródło