Comment obtenir la valeur d'une propriété par son nom via la réflexion en C# : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment obtenir la valeur d'une propriété par son nom via la réflexion en C# : analyse pour débutants

\n\n

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

\n\n

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

Qu'est-ce que la réflexion et pourquoi en a-t-on besoin ?

\n\n

La 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\n
    \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
\n\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\n

Exemple de base : obtenir la valeur d'une propriété par son nom

\n\n

Supposons que nous ayons une classe simple Person :

\n\n
public class Person\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n    public string City { get; set; }\n}
\n\n

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

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

Utilisons maintenant notre méthode :

\n\n
var 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\n

Tout fonctionne ! Les points clés :

\n
    \n
  • obj.GetType() — obtient l'objet Type qui décrit le type de notre objet.
  • \n
  • type.GetProperty("Name") — recherche la propriété publique nommée "Name". Retourne PropertyInfo ou null si la propriété est introuvable.
  • \n
  • propertyInfo.GetValue(obj) — retourne la valeur de cette propriété pour l'instance spécifique obj.
  • \n
\n\n

Nuances importantes et erreurs fréquentes (ce que les juniors ne disent pas)

\n\n

1. Sensibilité à la casse

\n

La méthode GetProperty est par défaut sensible à la casse. Si vous indiquez "name" au lieu de "Name", la propriété ne sera pas

Blogs

Book Recommendations