首頁 >後端開發 >C++ >C# 中反射可以修改私有唯讀欄位嗎?

C# 中反射可以修改私有唯讀欄位嗎?

DDD
DDD原創
2025-01-17 18:13:08114瀏覽

Can Reflection Modify Private Readonly Fields in C#?

利用 C# 反射修改私有唯讀欄位

C# 中的反射技術功能強大,允許存取和操作運行時類型、方法、屬性和欄位的資訊。一個常見問題是:能否在物件建構後修改私有唯讀欄位?

考慮以下場景:

<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>

這裡,bar 欄位宣告為 private readonly,這表示它只能在建構子中賦值。要稍後更改其值,需要使用反射。

使用反射,我們可以透過指定欄位名稱和綁定標誌來存取私有欄位。方法如下:

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

以上語句使用 GetField 方法取得 bar 字段,然後使用 SetValue 方法將其值變更為 456。

執行反射程式碼後,呼叫 foo.GetBar() 會輸出 456,證明私有唯讀欄位已在執行時成功修改。但是,需要注意的是,這種方式修改唯讀欄位不建議用於生產環境程式碼,因為它可能導致意外行為或執行時間錯誤。

以上是C# 中反射可以修改私有唯讀欄位嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn