Menggunakan Refleksi untuk Mengubah Suai Medan Bacaan Persendirian dalam C#
Refleksi dalam C# menawarkan keupayaan berkuasa, termasuk keupayaan untuk memanipulasi walaupun medan baca sahaja peribadi. Mari kita periksa sama ada kita boleh mengubah medan baca sahaja peribadi selepas objek dibuat.
Pertimbangkan contoh ini:
<code class="language-csharp">public class Foo { private readonly int bar; public Foo(int num) { bar = num; } public int GetBar() { return bar; } } Foo foo = new Foo(123); Console.WriteLine(foo.GetBar()); // Outputs 123</code>
Mengubah suai Medan dengan Refleksi
Sekarang, mari kita gunakan refleksi untuk menukar medan bar
:
<code class="language-csharp">typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(foo, 567);</code>
Coretan kod ini menggunakan pantulan untuk mengakses medan bar
peribadi dan menetapkan nilainya kepada 567.
Hasilnya
Selepas operasi pantulan ini, nilai bar
sememangnya telah berubah:
<code class="language-csharp">Console.WriteLine(foo.GetBar()); // Outputs 567</code>
Ini menunjukkan bahawa walaupun diisytiharkan private readonly
, pantulan membenarkan pengubahsuaian nilai medan selepas penciptaan objek. Walaupun ini mungkin, ia secara amnya dianggap sebagai amalan buruk dan harus dielakkan melainkan benar-benar perlu disebabkan oleh kemungkinan akibat yang tidak diduga dan isu kebolehselenggaraan.
Atas ialah kandungan terperinci Bolehkah Reflection Mengubah Suai Medan Baca Sahaja Peribadi C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!