Archives Wild Code School
C#

C# - Réflexion

Quête 35 sur 46

Après cette quête, tu sauras utiliser la réflexion pour inspecter les objets et les classes

Objectifs

  • Comprendre le principe de réflexion

  • Apprendre à utiliser l'espace de noms System.Reflection

Violer l'encapsulation

Lorsque tu codes, tu penses au fait que tes classes soient bien organisées et que ses membres soient correctement encapsulés. C'est-à-dire que toutes les attributs, propriétés et méthodes d'une classe ne sont accessibles que si ils doivent être mis à disposition à d'autres entités logicielles. Ainsi, lorsque l'encapsulation est correctement respectée, les attributs, méthodes et propriétés privées ne sont pas accessibles en dehors de l'instance d'une classe.

Le fait que les méthodes, attributs et propriétés ne sont pas accessibles en dehors d'une instance de classe n'est pas entièrement vrai. Il est possible d'accéder aux attributs, méthodes et propriétés privées d'une instance d'objet de n'importe quelle instance de classe. En utilisant la réflexion, il est possible de découvrir toutes les méthodes, propriétés et attributs d'un objet et d'y faire appel. Ainsi, il est possible de ne pas tenir compte de la visibilité des attributs, méthodes et propriétés d'une instance de classe en utilisation la réflexion.

↗
Qu'est-ce que la réflexion ?

FIl de discussion sur la réflexion

stackoverflow.com
↗
Qu'est-ce que la réflexion ?

Article sur la réflexion en C#

dev.to

Accéder aux propriétés d'un objet

Le namespace System.Reflection met à disposition un ensemble de méthodes et un mécanisme permettant d'accéder aux fonctionnalités internes d'une instance de classe. Ci-dessous, un exemple qui affiche toutes les propriétés et attributs d'un objet.

cs
using System;
using System.Reflection;

namespace ReflectionTest
{
    class ReflectedClass
    {
        private Int32 _id;
        private String Name { get; set; }

        public ReflectedClass()
        {
            _id = 0;
            Name = String.Empty;
        }

        private void DoSomething()
        {
            Console.WriteLine("I am doing something ...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var reflected = new ReflectedClass();
            DisplayAllAttributes(reflected);
        }

        private static void DisplayAllAttributes(object reflected)
        {
            Type objectType = reflected.GetType();

            PropertyInfo[] properties = objectType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
            MethodInfo[] methods = objectType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
            ConstructorInfo[] constructors = objectType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
            FieldInfo[] fields = objectType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

            Console.WriteLine("Properties");
            foreach (var p in properties)
            {
                Console.WriteLine("\t" + p);
            }
            Console.WriteLine("Methods");
            foreach (var m in methods)
            {
                Console.WriteLine("\t" + m);
            }

            Console.WriteLine("Constructors");
            foreach (var c in constructors)
            {
                Console.WriteLine("\t" + c);
            }

            Console.WriteLine("Fields");
            foreach (var f in fields)
            {
                Console.WriteLine("\t" + f);
            }
        }
    }
}

La méthode DisplayAllAttributes affiche tous les attributs, propriétés et méthodes d'une classe. Les BindingFlags permettent d'affiner la recherche en incluant les attributs, propriétés et méthodes privées.

↗
Utiliser la réflexion

Tutoriel sur l'utilisation de la réflexion en C#

csharp.net-tutorials.com
↗
La réflexion en détail

Documentation complète sur la

c-sharpcorner.com

Challenge

Inspection d'objets

Durant ce challenge, tu vas devoir écrire une classe qui permet d'inspecter des classes

Critères de validation

  • La solution est hébergée sur GitHub

  • Une méthode GetAllProperties récupère toutes les propriétés d'un Type

  • Une méthode GetAllFields récupère tous les attributs d'un Type

  • Une méthode GetAllMethods récupère toutes le méthodes d'un Type

  • Le programme affiche le nom et la visibilité des propriétés, attributs et méthodes récupérés