C# - Réflexion
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.
FIl de discussion sur la réflexion
Article sur la réflexion en C#
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.
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.
Tutoriel sur l'utilisation de la réflexion en C#
Documentation complète sur la
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
GetAllPropertiesrécupère toutes les propriétés d'unType -
Une méthode
GetAllFieldsrécupère tous les attributs d'unType -
Une méthode
GetAllMethodsrécupère toutes le méthodes d'unType -
Le programme affiche le nom et la visibilité des propriétés, attributs et méthodes récupérés