Comment obtenir la valeur d'une propriété par son nom via la réflexion en C# : analyse pour débutants
\n\nImaginez la situation : vous écrivez du code dans lequel vous devez accéder dynamiquement, à la volée, à une propriété d'un objet. Le nom de cette propriété provient, par exemple, d'un fichier de configuration, d'une requête JSON ou est saisi par l'utilisateur. Vous ne pouvez pas coder en dur object.PropertyName car vous ne connaissez pas le nom à l'avance. Que faire ?
La réflexion (reflection) vient à votre secours — un mécanisme puissant de C# qui permet d'examiner les types de données et leurs membres (propriétés, méthodes, champs) pendant l'exécution du programme. Dans cet article, nous allons décortiquer la question la plus populaire sur Stack Overflow : comment obtenir la valeur d'une propriété d'objet à partir d'une chaîne contenant son nom. Nous allons l'analyser avec des exemples concrets, du simple au complexe, et examiner les pièges fréquents dans lesquels tombent les débutants.
\n\nQu'est-ce que la réflexion et pourquoi en a-t-on besoin ?
\n\nLa réflexion en C# est la capacité d'un programme à "se regarder lui-même" et à obtenir des informations sur ses propres types. L'espace de noms System.Reflection fournit des classes comme Type, PropertyInfo, MethodInfo, qui vous permettent de :
- \n
- Connaître toutes les propriétés et méthodes d'une classe. \n
- Créer des instances de classes sans l'opérateur
new. \n - Appeler des méthodes et obtenir/définir les valeurs de propriétés à partir de leurs noms sous forme de chaînes. \n
Sans la réflexion, vous ne pourriez pas, par exemple, écrire un mappeur d'objets universel (comme AutoMapper) ou un sérialiseur qui fonctionne avec n'importe quel type de données.
\n\nExemple de base : obtenir la valeur d'une propriété par son nom
\n\nSupposons que nous ayons une classe simple Person :
public class Person\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public string City { get; set; }\n}\n\nNous voulons écrire une méthode qui prend un objet Person et une chaîne avec le nom de la propriété (par exemple, "Name" ou "Age") et retourne la valeur de cette propriété. Voici comment faire avec la réflexion :
using System;\nusing System.Reflection;\n\npublic static object GetPropertyValue(object obj, string propertyName)\n{\n if (obj == null) throw new ArgumentNullException(nameof(obj));\n if (string.IsNullOrEmpty(propertyName)) throw new ArgumentException("Le nom de la propriété ne peut pas être vide", nameof(propertyName));\n\n // On obtient le type de l'objet\n Type type = obj.GetType();\n\n // On obtient les informations sur la propriété par son nom\n PropertyInfo propertyInfo = type.GetProperty(propertyName);\n\n // On vérifie si la propriété existe\n if (propertyInfo == null)\n throw new ArgumentException($"La propriété '{propertyName}' est introuvable dans le type '{type.Name}'");\n\n // On obtient la valeur de la propriété\n return propertyInfo.GetValue(obj);\n}\n\nUtilisons maintenant notre méthode :
\n\nvar person = new Person { Name = "Anna", Age = 30, City = "Moscou" };\n\nstring name = (string)GetPropertyValue(person, "Name");\nint age = (int)GetPropertyValue(person, "Age");\n\nConsole.WriteLine($"Nom : {name}, Âge : {age}"); // Affichage : Nom : Anna, Âge : 30\n\nTout fonctionne ! Les points clés :
\n- \n
obj.GetType()— obtient l'objetTypequi décrit le type de notre objet. \n type.GetProperty("Name")— recherche la propriété publique nommée "Name". RetournePropertyInfoounullsi la propriété est introuvable. \n propertyInfo.GetValue(obj)— retourne la valeur de cette propriété pour l'instance spécifiqueobj. \n
Nuances importantes et erreurs fréquentes (ce que les juniors ne disent pas)
\n\n1. Sensibilité à la casse
\nLa méthode GetProperty est par défaut sensible à la casse. Si vous indiquez "name" au lieu de "Name", la propriété ne sera pas