So erhalten Sie den Eigenschaftswert anhand des Namens durch Reflexion in C#: Vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

So erhalten Sie den Eigenschaftswert anhand des Namens durch Reflexion in C#: Erklärung für Anfänger

\n\n

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

\n\n

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

Was ist Reflexion und warum wird sie benötigt?

\n\n

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

Ohne Reflexion könnten Sie beispielsweise keinen universellen Objekt-Mapper (wie AutoMapper) oder Serialisierer schreiben, die mit beliebigen Datentypen arbeiten.

\n\n

Basisbeispiel: Eigenschaftswert anhand des Namens abrufen

\n\n

Angenommen, wir haben eine einfache Klasse 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

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

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

Jetzt verwenden wir unsere Methode:

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

Es funktioniert! Die wichtigsten Punkte:

\n
    \n
  • obj.GetType() – ruft ein Type-Objekt ab, das den Typ unseres Objekts beschreibt.
  • \n
  • type.GetProperty("Name") – sucht nach einer öffentlichen Eigenschaft mit dem Namen "Name". Gibt PropertyInfo oder null zurück, wenn die Eigenschaft nicht gefunden wird.
  • \n
  • propertyInfo.GetValue(obj) – gibt den Wert dieser Eigenschaft für die spezifische Instanz obj zurück.
  • \n
\n\n

Wichtige Nuancen und häufige Fehler (worüber Junioren schweigen)

\n\n

1. Groß-/Kleinschreibung

\n

Die Methode GetProperty ist standardmäßig groß-/kleinschreibungsabhängig. Wenn Sie "name" anstelle von "Name" angeben, wird die Eigenschaft nicht

Blogs

Buchempfehlungen