Heim >Backend-Entwicklung >C++ >Kann Reflection die Einschränkungen für private schreibgeschützte Felder in C# umgehen?

Kann Reflection die Einschränkungen für private schreibgeschützte Felder in C# umgehen?

Susan Sarandon
Susan SarandonOriginal
2025-01-17 18:06:09162Durchsuche

Can Reflection Bypass C#'s Private Readonly Field Restrictions?

Verwenden Sie C#-Reflexion, um private schreibgeschützte Felder zu ändern

Der Modifikator

private readonly in C# soll verhindern, dass Felder nach dem Konstruktor geändert werden. Wir können jedoch die Möglichkeit einer Änderung durch Reflexion untersuchen.

Problem: Verwendung von Reflection zum Ändern privater schreibgeschützter Felder

Können private schreibgeschützte Felder mithilfe von Reflektion geändert werden, nachdem der Konstruktor ausgeführt wurde?

Detaillierte Analyse

Betrachten Sie den folgenden C#-Code:

<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
// 在此处添加反射代码。
Console.WriteLine(foo.GetBar()); // 输出 456</code>

Lösung mittels Reflexion

Reflexion bietet einen Weg, dieses Ziel zu erreichen. So geht's:

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

Dieser Code verwendet Reflektion, um das private schreibgeschützte Feld „bar“ der FooKlasseninstanzfoo zu ändern. Obwohl readonly eine direkte Änderung verhindert, wird diese Einschränkung durch die Reflexion umgangen. Es ist zu beachten, dass dieser Ansatz im Allgemeinen nicht empfohlen wird, da er die Kapselung unterbricht und die Wartung und das Debuggen des Codes erschweren kann.

Das obige ist der detaillierte Inhalt vonKann Reflection die Einschränkungen für private schreibgeschützte Felder in C# umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn