Maison >développement back-end >C++ >Reflection peut-il modifier les champs privés en lecture seule en C# ?

Reflection peut-il modifier les champs privés en lecture seule en C# ?

DDD
DDDoriginal
2025-01-17 18:13:08114parcourir

Can Reflection Modify Private Readonly Fields in C#?

Utilisez la réflexion C# pour modifier les champs privés en lecture seule

La technologie Reflection en C# est puissante, permettant l'accès et la manipulation des informations d'exécution sur les types, les méthodes, les propriétés et les champs. Une question courante est la suivante : les champs privés en lecture seule peuvent-ils être modifiés une fois l'objet construit ?

Considérez le scénario suivant :

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

Ici, le champ bar est déclaré comme private readonly, ce qui signifie qu'il ne peut être attribué que dans le constructeur. Pour modifier sa valeur ultérieurement, vous devez utiliser la réflexion.

Grâce à la réflexion, nous pouvons accéder aux champs privés en spécifiant le nom du champ et l'indicateur de liaison. Voici comment procéder :

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

L'instruction ci-dessus utilise la méthode GetField pour obtenir le champ bar, puis utilise la méthode SetValue pour changer sa valeur en 456.

Après avoir exécuté le code de réflexion, l'appel de foo.GetBar() affichera 456, prouvant que le champ privé en lecture seule a été modifié avec succès au moment de l'exécution. Cependant, il est important de noter que la modification des champs en lecture seule de cette manière n'est pas recommandée pour le code de production car cela pourrait provoquer un comportement inattendu ou des erreurs d'exécution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn