利用 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中文網其他相關文章!