Rumah > pembangunan bahagian belakang > C++ > Bolehkah Reflection Mengubah Suai Medan Baca Sahaja dalam C#?

Bolehkah Reflection Mengubah Suai Medan Baca Sahaja dalam C#?

DDD
Lepaskan: 2025-01-17 18:13:08
asal
110 orang telah melayarinya

Can Reflection Modify Private Readonly Fields in C#?

Gunakan refleksi C# untuk mengubah suai medan baca sahaja peribadi

Teknologi refleksi dalam C# adalah berkuasa, membenarkan akses dan manipulasi maklumat masa jalan pada jenis, kaedah, sifat dan medan. Soalan biasa ialah: Bolehkah medan baca sahaja peribadi diubah suai selepas objek dibina?

Pertimbangkan senario 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</code>
Salin selepas log masuk

Di sini, medan bar diisytiharkan sebagai private readonly, yang bermaksud ia hanya boleh diberikan dalam pembina. Untuk menukar nilainya kemudian, anda perlu menggunakan refleksi.

Menggunakan refleksi, kita boleh mengakses medan peribadi dengan menyatakan nama medan dan bendera mengikat. Begini caranya:

<code class="language-csharp">typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(foo, 456);</code>
Salin selepas log masuk

Pernyataan di atas menggunakan kaedah GetField untuk mendapatkan medan bar, dan kemudian menggunakan kaedah SetValue untuk menukar nilainya kepada 456.

Selepas melaksanakan kod pantulan, memanggil foo.GetBar() akan mengeluarkan 456, membuktikan bahawa medan baca sahaja peribadi berjaya diubah suai pada masa jalan. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa mengubah suai medan baca sahaja dengan cara ini tidak disyorkan untuk kod pengeluaran kerana ia boleh menyebabkan kelakuan yang tidak dijangka atau ralat masa jalan.

Atas ialah kandungan terperinci Bolehkah Reflection Mengubah Suai Medan Baca Sahaja dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan