Saya mencoba untuk memanggil metode melalui refleksi dengan parameter dan saya mendapatkan:
objek tidak cocok dengan tipe target
Jika saya memanggil metode tanpa parameter, itu berfungsi dengan baik. Berdasarkan kode berikut jika saya memanggil metode Test("TestNoParameters")
, itu berfungsi dengan baik. Namun jika saya menelepon Test("Run")
, saya mendapat pengecualian. Apakah ada yang salah dengan kode saya?
Tujuan awal saya adalah untuk melewatkan array objek misalnya public void Run(object[] options)
tetapi ini tidak berhasil dan saya mencoba sesuatu yang lebih sederhana mis. String tanpa keberhasilan.
// 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
sumber
sumber
Jawaban:
Ubah "methodInfo" menjadi "classInstance", sama seperti dalam panggilan dengan array parameter nol.
sumber
Anda memiliki bug di sana
harus
sumber
Kesalahan mendasar ada di sini:
Anda memohon metode ini pada contoh dari
MethodInfo
. Anda harus memberikan contoh jenis objek yang ingin Anda gunakan.sumber
Solusi yang disediakan tidak berfungsi untuk contoh jenis yang dimuat dari rakitan jarak jauh. Untuk melakukan itu, berikut adalah solusi yang berfungsi di semua situasi, yang melibatkan pemetaan ulang tipe eksplisit dari jenis yang dikembalikan melalui panggilan CreateInstance.
Ini adalah bagaimana saya perlu membuat classInstance saya, karena terletak di perakitan jarak jauh.
Namun, bahkan dengan jawaban yang diberikan di atas, Anda masih akan mendapatkan kesalahan yang sama. Berikut ini cara melakukannya:
Kemudian lakukan seperti pengguna lain yang disebutkan di sini.
sumber
Saya akan menggunakannya seperti ini, caranya lebih pendek dan tidak akan menimbulkan masalah
sumber
sumber
Saya mencoba untuk bekerja dengan semua jawaban yang disarankan di atas tetapi sepertinya tidak ada yang berhasil untuk saya. Jadi saya mencoba menjelaskan apa yang berhasil untuk saya di sini.
Saya percaya jika Anda memanggil beberapa metode seperti di
Main
bawah ini atau bahkan dengan parameter tunggal seperti dalam pertanyaan Anda, Anda hanya perlu mengubah jenis parameter daristring
menjadiobject
agar ini berfungsi. Saya memiliki kelas seperti di bawah iniMaka Anda harus melewati parameterArray di dalam array objek seperti di bawah ini saat memintanya. Metode berikut adalah apa yang Anda butuhkan untuk bekerja
Metode ini membuatnya mudah untuk memanggil metode, dapat disebut sebagai berikut
sumber
Saya meminta rata-rata tertimbang melalui refleksi. Dan telah menggunakan metode dengan lebih dari satu parameter.
sumber
jika bukan eksternal .dll (alih-alih
this.GetType()
, Anda dapat menggunakantypeof(YourClass)
).ps memposting jawaban ini karena banyak pengunjung masuk ke sini untuk jawaban ini.
sumber