Rumah >pembangunan bahagian belakang >C++ >Bolehkah Reflection Bypass Sekatan Medan Baca Sahaja Peribadi C#?
Gunakan refleksi C# untuk mengubah suai medan baca sahaja peribadi
Pengubah suaiprivate readonly
dalam C# direka untuk menghalang medan daripada diubah suai selepas pembina, tetapi kita boleh meneroka kemungkinan pengubahsuaian melalui refleksi.
Masalah: Menggunakan refleksi untuk mengubah suai medan baca sahaja peribadi
Bolehkah medan baca sahaja peribadi ditukar menggunakan refleksi selepas pembina telah dilaksanakan?
Analisis terperinci
Pertimbangkan kod C# berikut:
<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()); // 输出 123 // 在此处添加反射代码。 Console.WriteLine(foo.GetBar()); // 输出 456</code>
Penyelesaian menggunakan pantulan
Refleksi menyediakan cara untuk mencapai matlamat ini. Begini caranya:
<code class="language-csharp">typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(foo, 567);</code>
Kod ini menggunakan pantulan untuk mengubah suai "bar" medan baca sahaja peribadi Foo
contoh kelasfoo
. Walaupun readonly
menghalang pengubahsuaian langsung, pantulan memintas had ini. Perlu diingat bahawa pendekatan ini secara amnya tidak disyorkan kerana ia memecahkan enkapsulasi dan mungkin membuat kod sukar untuk dikekalkan dan nyahpepijat.
Atas ialah kandungan terperinci Bolehkah Reflection Bypass Sekatan Medan Baca Sahaja Peribadi C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!