So erhalten Sie den Eigenschaftswert anhand des Namens durch Reflexion in C#: Erklärung für Anfänger
\n\nStellen Sie sich folgende Situation vor: Sie schreiben Code, in dem Sie dynamisch, im laufenden Betrieb, auf eine Eigenschaft eines Objekts zugreifen müssen. Der Name dieser Eigenschaft stammt beispielsweise aus einer Konfigurationsdatei, einer JSON-Anfrage oder wird vom Benutzer eingegeben. Ein festes object.PropertyName ist nicht möglich – Sie kennen den Namen nicht im Voraus. Was tun?
Hier kommt die Reflexion (Reflection) zur Hilfe – ein leistungsstarker Mechanismus in C#, der es Ihnen ermöglicht, Datentypen und ihre Member (Eigenschaften, Methoden, Felder) zur Laufzeit des Programms zu untersuchen. In diesem Artikel behandeln wir die häufigste Frage auf Stack Overflow: Wie erhält man den Wert einer Objekteigenschaft anhand einer Zeichenfolge, die ihren Namen enthält? Wir gehen von einfachen zu komplexen Beispielen über und betrachten häufige Fallstricke, auf die Anfänger stoßen.
\n\nWas ist Reflexion und warum wird sie benötigt?
\n\nReflexion in C# ist die Fähigkeit eines Programms, "sich selbst zu betrachten" und Informationen über seine eigenen Typen zu erhalten. Der Namespace System.Reflection stellt Klassen wie Type, PropertyInfo, MethodInfo bereit, die es Ihnen ermöglichen:
- \n
- Alle Eigenschaften und Methoden einer Klasse zu erfahren. \n
- Instanzen von Klassen ohne den
new-Operator zu erstellen. \n - Methoden aufzurufen und Werte von Eigenschaften anhand ihrer Zeichenfolgennamen abzurufen/festzulegen. \n
Ohne Reflexion könnten Sie beispielsweise keinen universellen Objekt-Mapper (wie AutoMapper) oder Serialisierer schreiben, die mit beliebigen Datentypen arbeiten.
\n\nBasisbeispiel: Eigenschaftswert anhand des Namens abrufen
\n\nAngenommen, wir haben eine einfache Klasse 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\nWir möchten eine Methode schreiben, die ein Person-Objekt und eine Zeichenfolge mit dem Eigenschaftsnamen (z. B. "Name" oder "Age") akzeptiert und den Wert dieser Eigenschaft zurückgibt. So funktioniert das mit Reflexion:
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("Der Eigenschaftsname darf nicht leer sein", nameof(propertyName));\n\n // Den Typ des Objekts abrufen\n Type type = obj.GetType();\n\n // Informationen über die Eigenschaft anhand ihres Namens abrufen\n PropertyInfo propertyInfo = type.GetProperty(propertyName);\n\n // Prüfen, ob eine solche Eigenschaft existiert\n if (propertyInfo == null)\n throw new ArgumentException($"Die Eigenschaft '{propertyName}' wurde im Typ '{type.Name}' nicht gefunden");\n\n // Den Wert der Eigenschaft abrufen\n return propertyInfo.GetValue(obj);\n}\n\nJetzt verwenden wir unsere Methode:
\n\nvar person = new Person { Name = "Anna", Age = 30, City = "Moskau" };\n\nstring name = (string)GetPropertyValue(person, "Name");\nint age = (int)GetPropertyValue(person, "Age");\n\nConsole.WriteLine($"Name: {name}, Alter: {age}"); // Ausgabe: Name: Anna, Alter: 30\n\nEs funktioniert! Die wichtigsten Punkte:
\n- \n
obj.GetType()– ruft einType-Objekt ab, das den Typ unseres Objekts beschreibt. \n type.GetProperty("Name")– sucht nach einer öffentlichen Eigenschaft mit dem Namen "Name". GibtPropertyInfoodernullzurück, wenn die Eigenschaft nicht gefunden wird. \n propertyInfo.GetValue(obj)– gibt den Wert dieser Eigenschaft für die spezifische Instanzobjzurück. \n
Wichtige Nuancen und häufige Fehler (worüber Junioren schweigen)
\n\n1. Groß-/Kleinschreibung
\nDie Methode GetProperty ist standardmäßig groß-/kleinschreibungsabhängig. Wenn Sie "name" anstelle von "Name" angeben, wird die Eigenschaft nicht