Postingan asli telah diposting di GCDN. Karena GCDN telah melakukan penyesuaian integrasi dan sekarang fokus pada pertukaran produk dan alasan lainnya, Blog GCDN telah ditutup, jadi saya harus memindahkan beberapa yang berguna ke sini.
13 Agustus 2009 12:29 dengan mengedipkan mata
Menulis blog ini, CyljXu mengajukan pertanyaan kepada saya hari ini: Bagaimana cara memanggil metode dengan parameter ref atau out melalui refleksi? Berpikir bahwa orang lain mungkin mengalami masalah ini, saya ingin mencatatnya untuk dicari oleh pembaca di masa mendatang.
Hal ini dijelaskan di MSDN, lihat metode MethodBase.Invoke.
Pemanggilan Objek publik (Obj objek, Parameter Objek[])
Visual C++
publik
: Objek virtual^ Panggil( Objek^ obj, arrayJ#
publik
Pemanggilan Objek terakhir (Obj objek, parameter Objek[])
JScript
publik
terakhir
fungsi
Memanggil( obj : Objek, parameter : Objek[] ) : Objek
parameter
Jenis objek: Sistem.Objek
Objek dimana metode atau konstruktor dipanggil. Jika metodenya statis, parameter ini diabaikan. Jika konstruktornya statis, parameter ini harus berupa referensi nol (Tidak Ada dalam Visual Basic) atau turunan dari kelas tempat konstruktor ditentukan.
tipe parameter: Sistem.Objek[]
Daftar parameter metode atau konstruktor yang akan dipanggil. Ini adalah array objek yang memiliki nomor, urutan, dan tipe yang sama dengan parameter metode atau konstruktor yang dipanggil. Jika tidak ada parameter, parameter harus berupa referensi nol (Tidak Ada di Visual Basic).
Jika metode atau konstruktor yang diwakili oleh instance ini menggunakan parameter ref (ByRef dalam Visual Basic), parameter tersebut tidak memerlukan atribut khusus apa pun saat fungsi ini digunakan untuk memanggil metode atau konstruktor. Jika suatu objek dalam array tidak diinisialisasi secara eksplisit dengan suatu nilai, objek tersebut akan berisi nilai default untuk tipe objek tersebut. Untuk elemen bertipe referensi, nilainya adalah null Referensi (Tidak Ada di Visual Basic). Untuk elemen bertipe nilai, nilainya adalah 0, 0,0, atau salah, bergantung pada tipe elemen tertentu.
Jadi bagaimana cara memanggil dan menangani nilai yang diteruskan? Silakan lihat contoh berikut:
1 kelas Program 2 { 3 static void Main(string[] args) 4 { 5 string content = "main"; //#1 variabel 6 MethodInfo testMethod = typeof(Program).GetMethod("TestMethod", 7 BindingFlags.Static | BindingFlags.NonPublic); 8 if (testMethod != null) 9 {10 // Cara berikut tidak dapat mengambil konten kembali.11 // --------------------- ----------------12 testMethod.Invoke(null, objek baru[] { konten /* #1 variabel */ });13 Console.WriteLine(konten); 1 variabel, Outputnya adalah: main14 // ----------------------------------------- ----15 16 17 objek [] invokeArgs = objek baru[] { konten /* #1 variabel */ };18 testMethod.Invoke(null, invokeArgs);19 konten = (string)invokeArgs[0]; Variabel #2, lewati dari pemanggilan, setel ke content.20 Console.WriteLine(content); // variabel #2, Outputnya adalah: test21 }22 }23 24 static void TestMethod(ref string arg)25 {26 arg = "test "; // Variabel #2, ingin melewati proses utama.27 }28 }
Menjadi apostrof yang mengubah “Mustahil” menjadi “Saya mungkin”
--------------------------------------------------- --
Blog WinkingZhang ( http://winkingzhang.cnblogs.com )
GCDN( http://gcdn.grapecity.com/cs )
-