Verwenden Sie C#-Reflexion, um private schreibgeschützte Felder zu ändern
Die Reflection-Technologie in C# ist leistungsstark und ermöglicht den Zugriff und die Bearbeitung von Laufzeitinformationen zu Typen, Methoden, Eigenschaften und Feldern. Eine häufig gestellte Frage lautet: Können private schreibgeschützte Felder geändert werden, nachdem das Objekt erstellt wurde?
Stellen Sie sich das folgende Szenario vor:
<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>
Hier wird das Feld bar
als private readonly
deklariert, was bedeutet, dass es nur im Konstruktor zugewiesen werden kann. Um seinen Wert später zu ändern, müssen Sie Reflektion verwenden.
Mithilfe von Reflection können wir auf private Felder zugreifen, indem wir den Feldnamen und das Bindungsflag angeben. So geht's:
<code class="language-csharp">typeof(Foo).GetField("bar", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(foo, 456);</code>
Die obige Anweisung verwendet die Methode GetField
, um das Feld bar
abzurufen, und verwendet dann die Methode SetValue
, um seinen Wert in 456 zu ändern.
Nach der Ausführung des Reflektionscodes wird beim Aufruf von foo.GetBar()
456 ausgegeben, was beweist, dass das private schreibgeschützte Feld zur Laufzeit erfolgreich geändert wurde. Es ist jedoch wichtig zu beachten, dass die Änderung schreibgeschützter Felder auf diese Weise für Produktionscode nicht empfohlen wird, da dies zu unerwartetem Verhalten oder Laufzeitfehlern führen kann.
Das obige ist der detaillierte Inhalt vonKann Reflection private schreibgeschützte Felder in C# ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!