在 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()); // Outputs 123</code>
用反射修改場
現在,讓我們使用反射來更改 bar
欄位:
<code class="language-csharp">typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(foo, 567);</code>
此程式碼片段使用反射來存取私有 bar
欄位並將其值設為 567。
結果
經過這次反射操作,bar
的數值確實改變了:
<code class="language-csharp">Console.WriteLine(foo.GetBar()); // Outputs 567</code>
這表明,儘管聲明了private readonly
,但反射允許在物件創建後修改欄位的值。 雖然這是可能的,但通常被認為是不好的做法,除非由於潛在的不可預見的後果和可維護性問題而絕對必要,否則應該避免。
以上是反射可以修改C#的私有唯讀欄位嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!