Gunakan refleksi untuk memanggil kaedah dengan parameter
Penerangan masalah:
Saya menemui pengecualian "Objek tidak sepadan dengan jenis sasaran" apabila cuba memanggil kaedah dengan parameter melalui pantulan. Walau bagaimanapun, jika kaedah dipanggil tanpa parameter, ia berjaya dilaksanakan.
Penyelesaian:
Untuk menyelesaikan isu ini, pastikan anda menggunakan tika yang betul semasa memanggil kaedah tersebut. Dalam baris berikut dalam blok "else", gantikan "methodInfo" dengan "classInstance":
<code class="language-csharp">result = methodInfo.Invoke(classInstance, parametersArray);</code>
Penjelasan terperinci:
Dalam pengaturcaraan berorientasikan objek, setiap kaedah dikaitkan dengan contoh objek. Apabila memanggil kaedah melalui refleksi, adalah penting untuk menyediakan contoh yang betul untuk melaksanakan panggilan. Dalam kod yang disediakan, kaedah "Jalankan" ditakrifkan sebagai kaedah contoh kelas "Utama". Oleh itu, ia mesti dipanggil pada contoh kelas.
Pada mulanya, cuba panggil kaedah menggunakan "methodInfo" sebagai parameter pertama kaedah "Invoke". Walau bagaimanapun, "methodInfo" mewakili objek MethodInfo, bukan contoh kelas "Utama". Pembolehubah "classInstance" (sebelum ini dibuat menggunakan "Activator.CreateInstance") memegang tika yang harus digunakan untuk panggilan.
Dengan mengubah suai kod untuk memanggil kaedah dengan "classInstance" sebagai parameter pertama, tika yang betul disediakan dan kaedah itu boleh berjaya dipanggil dengan parameter yang ditentukan.
Kod diubah suai:
<code class="language-csharp">... if (parameters.Length == 0) { // 这部分工作正常 result = methodInfo.Invoke(classInstance, null); } else { object[] parametersArray = new object[] { "Hello" }; // 现在调用可以正常工作了 result = methodInfo.Invoke(classInstance, parametersArray); } ...</code>
Atas ialah kandungan terperinci Mengapa Kod Refleksi Saya Membuang 'objek tidak sepadan dengan jenis sasaran' Apabila Menggunakan Kaedah Berparameter?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!