Aus der Welt von PHP habe ich beschlossen, C # auszuprobieren. Ich hatte eine Suche, kann aber anscheinend keine Antwort darauf finden, wie ich das Äquivalent dazu machen kann.
$object = new Object();
$vars = get_class_vars(get_class($object));
foreach($vars as $var)
{
doSomething($object->$var);
}
Ich habe im Grunde eine Liste eines Objekts. Das Objekt kann einer von drei verschiedenen Typen sein und verfügt über eine Reihe öffentlicher Eigenschaften. Ich möchte in der Lage sein, eine Liste der Eigenschaften für das Objekt abzurufen, sie zu durchlaufen und sie dann in eine Datei zu schreiben. Ich denke, das hat etwas mit C # -Reflexion zu tun, aber es ist alles neu für mich.
Jede Hilfe wäre sehr dankbar.
c#
reflection
m4rc
quelle
quelle
Antworten:
Dies sollte es tun:
quelle
System.Reflection
NamespacePropertyInfo[] props = input.GetType().GetProperties();
Newtonsoft.Json.JsonConvert
?quelle
Ja, Reflexion wäre der richtige Weg. Zunächst erhalten Sie die
Type
, die den Typ (zur Laufzeit) der Instanz in der Liste darstellt. Sie können dies tun, indem Sie dieGetType
MethodeObject
aufrufen . Da es sich in derObject
Klasse befindet, kann es von jedem Objekt in .NET aufgerufen werden, da alle Typen davon abgeleitet sindObject
( technisch gesehen nicht alles , aber das ist hier nicht wichtig).Sobald Sie die
Type
Instanz haben, können Sie dieGetProperties
Methode aufrufen , um diePropertyInfo
Instanzen abzurufen, die die Laufzeitinformationen zu den Eigenschaften auf der darstellenType
.Beachten Sie, dass Sie die Überladungen von verwenden können
GetProperties
, um zu klassifizieren, welche Eigenschaften Sie abrufen.Von dort aus schreiben Sie die Informationen einfach in eine Datei.
Ihr Code oben, übersetzt, wäre:
Beachten Sie, dass Sie, wenn Sie Methoden- oder Feldinformationen wünschen, eine der Überladungen der Methoden
GetMethods
oder aufrufen müssenGetFields
.Beachten Sie auch, dass es eine Sache ist, die Mitglieder in einer Datei aufzulisten, aber Sie sollten diese Informationen nicht verwenden, um die Logik basierend auf Eigenschaftssätzen zu steuern.
Angenommen, Sie haben die Kontrolle über die Implementierungen der Typen, sollten Sie von einer gemeinsamen Basisklasse ableiten oder eine gemeinsame Schnittstelle implementieren und diese aufrufen (Sie können den Operator
as
oder verwendenis
, um zu bestimmen, mit welcher Basisklasse / Schnittstelle Sie arbeiten Laufzeit).Wenn Sie diese Typdefinitionen jedoch nicht steuern und die Logik basierend auf dem Mustervergleich steuern müssen, ist dies in Ordnung.
quelle
Nun, in C # ist es ähnlich. Hier ist eines der einfachsten Beispiele (nur für öffentliche Immobilien):
quelle
Um einen bestimmten Eigenschaftswert aus dem Eigenschaftsnamen abzurufen
um auf den Eigenschaftswert von Name über den Zeichenfolgennamen der Eigenschaft zuzugreifen
quelle
Sie können GetType - GetProperties - Linq Foreach verwenden :
quelle
Einzeilige Lösung mit Linq ...
quelle
Hier ist etwas, das ich verwende, um ein
IEnumerable<T>
in ein zu verwandelnDataTable
, das Spalten enthält, dieT
die Eigenschaften darstellen, mit einer Zeile für jedes Element inIEnumerable
:Dies ist "etwas" überkompliziert, aber es ist eigentlich ziemlich gut, um zu sehen, was das Ergebnis ist, wie Sie es
List<T>
zum Beispiel nennen können:Und Sie erhalten eine DataTable mit der folgenden Struktur:
Mit einer Zeile pro Artikel in Ihrem
List<Car>
quelle
In diesem Beispiel werden alle Zeichenfolgeneigenschaften eines Objekts gekürzt.
quelle
Ich habe nicht gefunden, dass dies funktioniert, sagen wir Anwendungsobjekte. Ich habe jedoch Erfolg gehabt mit
quelle
quelle
quelle
Sie können dies versuchen:
Sobald jedes Array die IEnumerable-Schnittstelle implementiert
quelle