Ich versuche, die Datentransformation mithilfe des Reflection 1- Beispiels in meinem Code zu implementieren .
Die GetSourceValue
Funktion hat einen Schalter, der verschiedene Typen vergleicht, aber ich möchte diese Typen und Eigenschaften entfernen und GetSourceValue
den Wert der Eigenschaft nur mit einer einzigen Zeichenfolge als Parameter abrufen. Ich möchte eine Klasse und eine Eigenschaft in der Zeichenfolge übergeben und den Wert der Eigenschaft auflösen.
Ist das möglich?
c#
reflection
properties
pedrofernandes
quelle
quelle
public static T GetPropertyValue<T>(object obj, string propName) { return (T)obj.GetType().GetProperty(propName).GetValue(obj, null); }
src.GetType().GetProperty(propName)?.GetValue(src, null);
";).GetProperty
und auslösenPropertyNotFoundException
oder etwas, wenn Null).Wie wäre es mit so etwas:
Auf diese Weise können Sie mit einer einzelnen Zeichenfolge wie folgt in Eigenschaften absteigen:
Sie können diese Methoden entweder als statische Methoden oder als Erweiterungen verwenden.
quelle
PropertyInfo.PropertyType
anstelle vonobj.GetType()
verschachtelten Eigenschaften zu verwenden, genau wie dies der Zugriff auf die Eigenschaft einer verschachtelten Eigenschaft tun würde.nameof
Ausdruck ab C # 6 wie folgt verwenden:nameof(TimeOfDay.Minutes)
für den Parameter name, wenn Sie die Funktion aufrufen, um magische Zeichenfolgen zu entfernen und diesen Aufrufen Sicherheit bei der Kompilierung zu verleihen.Zu jedem hinzufügen
Class
:Dann können Sie verwenden als:
quelle
SetValue
undGetValue
Methoden arbeiten mitObject
. Wenn Sie mit einem bestimmten Typ arbeiten müssen, sollten Sie das Ergebnis vonGetValue
und den Wert umwandeln, um ihn zuzuweisenSetValue
Was ist mit der Verwendung
CallByName
desMicrosoft.VisualBasic
Namespace (Microsoft.VisualBasic.dll
)? Es verwendet Reflektion, um Eigenschaften, Felder und Methoden von normalen Objekten, COM-Objekten und sogar dynamischen Objekten abzurufen.und dann
quelle
Tolle Antwort von jheddings. Ich möchte es verbessern und die Referenzierung von aggregierten Arrays oder Sammlungen von Objekten ermöglichen, sodass propertyName property1.property2 [X] .property3 sein kann:
quelle
Wenn ich den Code von Ed S. verwende, bekomme ich
Es scheint, dass
GetProperty()
dies in Xamarin.Forms nicht verfügbar ist.TargetFrameworkProfile
befindet sichProfile7
in meiner Portable Class Library (.NET Framework 4.5, Windows 8, ASP.NET Core 1.0, Xamarin.Android, Xamarin.iOS, Xamarin.iOS Classic).Jetzt habe ich eine funktionierende Lösung gefunden:
Quelle
quelle
In Bezug auf die Diskussion über verschachtelte Eigenschaften können Sie alle Überlegungen vermeiden, wenn Sie
DataBinder.Eval Method (Object, String)
Folgendes verwenden:Natürlich müssen Sie einen Verweis auf die
System.Web
Baugruppe hinzufügen , aber dies ist wahrscheinlich keine große Sache.quelle
Die aufzurufende Methode wurde in .NET Standard (ab 1.6) geändert. Wir können auch den Null-Bedingungsoperator von C # 6 verwenden.
quelle
? operator
Verwenden von PropertyInfo des System.Reflection- Namespace. Reflection wird problemlos kompiliert, unabhängig davon, auf welche Eigenschaft wir zugreifen möchten. Der Fehler tritt zur Laufzeit auf.
Es funktioniert gut, die Location-Eigenschaft eines Objekts abzurufen
Wir erhalten den Ort: {X = 71, Y = 27} Auf die gleiche Weise können wir auch location.X oder location.Y zurückgeben.
quelle
Auf diese Weise erhalten Sie alle Eigenschaften mit ihren Werten in einer Liste.
quelle
type.GetProperty(pi.Name)
wenn das == für die Variable istpi
?if
selfValue?.ToString()
if
selfValue==null?null:selfValue.ToString()
List<KeyValuePair<
ist seltsam, verwenden Sie ein WörterbuchDictionary<string, string>
Der folgende Code ist eine rekursive Methode zum Anzeigen der gesamten Hierarchie aller in der Objektinstanz enthaltenen Eigenschaftsnamen und -werte. Diese Methode verwendet eine vereinfachte Version der
GetPropertyValue()
Antwort von AlexD oben in diesem Thread. Dank dieses Diskussionsthreads konnte ich herausfinden, wie das geht!Mit dieser Methode zeige ich beispielsweise eine Explosion oder einen Speicherauszug aller Eigenschaften in einer
WebService
Antwort, indem ich die Methode wie folgt aufrufe:quelle
quelle
quelle
Die folgende Methode funktioniert perfekt für mich:
So erhalten Sie den Eigenschaftswert:
So legen Sie den Eigenschaftswert fest:
quelle
quelle
Hier ist eine andere Möglichkeit, eine verschachtelte Eigenschaft zu finden, für die die Zeichenfolge nicht erforderlich ist, um den Verschachtelungspfad anzugeben. Gutschrift an Ed S. für die Single-Property-Methode.
quelle
Type.GetProperty
zurückgegeben wird,null
anstatt aufzurufenGetValue
undNullReferenceException
s in eine Schleife zu werfen.Sie erwähnen nie, welches Objekt Sie untersuchen, und da Sie diejenigen ablehnen, die auf ein bestimmtes Objekt verweisen, gehe ich davon aus, dass Sie ein statisches Objekt meinen.
Beachten Sie, dass ich das zu untersuchende Objekt mit der lokalen Variablen markiert habe
obj
.null
bedeutet statisch, andernfalls stellen Sie es auf das ein, was Sie wollen. Beachten Sie auch, dass diesGetEntryAssembly()
eine der wenigen verfügbaren Methoden ist, um die "laufende" Assembly zu erhalten. Sie können damit herumspielen, wenn Sie Schwierigkeiten beim Laden des Typs haben.quelle
Schauen Sie sich die Heleonix.Reflection- Bibliothek an. Sie können Mitglieder über Pfade abrufen / setzen / aufrufen oder einen Getter / Setter (Lambda in einem Delegaten kompiliert) erstellen, der schneller als die Reflexion ist. Zum Beispiel:
Oder erstellen Sie einen Getter einmal und zwischenspeichern Sie ihn zur Wiederverwendung (dies ist leistungsfähiger, löst jedoch möglicherweise eine NullReferenceException aus, wenn ein Zwischenmitglied null ist):
Wenn Sie
List<Action<object, object>>
verschiedene Getter erstellen möchten , geben Sie einfach Basistypen für kompilierte Delegaten an (Typkonvertierungen werden zu kompilierten Lambdas hinzugefügt):quelle
kürzerer Weg ....
quelle
jheddings und AlexD haben beide hervorragende Antworten zum Auflösen von Eigenschaftszeichenfolgen geschrieben. Ich würde meine gerne in die Mischung einfließen lassen, da ich genau zu diesem Zweck eine eigene Bibliothek geschrieben habe.
Die Hauptklasse von Pather.CSharp ist
Resolver
. Standardmäßig können Eigenschaften, Array- und Wörterbucheinträge aufgelöst werden.Zum Beispiel, wenn Sie ein solches Objekt haben
und wollen bekommen
Property2
, können Sie es so machen:Dies ist das grundlegendste Beispiel für die Pfade, die aufgelöst werden können. Wenn Sie sehen möchten, was es sonst noch kann oder wie Sie es erweitern können, gehen Sie einfach zu seiner Github-Seite .
quelle
Hier ist meine Lösung. Es funktioniert auch mit COM-Objekten und ermöglicht den Zugriff auf Sammlungs- / Array-Elemente von COM-Objekten.
quelle
Folgendes habe ich aufgrund anderer Antworten erhalten. Ein wenig übertrieben, wenn es darum geht, mit der Fehlerbehandlung so spezifisch zu werden.
quelle