Ich möchte eine Eigenschaft an eine Funktion übergeben, so dass die Funktion sowohl den Wert der Eigenschaft als auch den Namen der Eigenschaft kennt. So kann ich Fehler zurückgeben, die den Eigenschaftsnamen entsprechen.C# Übergeben/Abrufen eines Eigenschaftsnamens aus einem Parameter ohne Reflektion
Ich habe derzeit Code wie folgt:
var userNameField = personField.GetChildField(f => f.UserName, nameof(personField.Value.UserName));
viele Male wiederholt, so dass der zweite Parameter ist der Name der Eigenschaft innerhalb des Lambda des ersten Parameters ist.
Ist es möglich, diesen Parameter zu automatisieren, so:
- Der Duplikat-Code wird
- zur Compile-Zeit berechnet wird für jeden Anruf
Idealerweise würde ich meinen Code mag einfach aussehen:
var userNameField = personField.GetChildField(f => f.UserName);
ich habe habe dies funktioniert unter Verwendung der Reflexion mit Expression<Func...
, d. h. ((MemberExpression) getPropertyFunc.Body).Member.Name;
, aber das ist zu langsam, insbesondere kompiliert den Ausdruck in eine Funktion, die ich verwenden kann, um den Eigenschaftswert zu holen.
In ähnlicher Weise habe ich hier durch die Ideen zu lesen: Get name of property as a string
Gibt es eine Möglichkeit, die Eigenschaftsnamen bei der Kompilierung von der GetChildField
Funktion zu bevölkern? Oder es irgendwie in das Modell codieren?
Wenn der Ausdruck Kompilieren zu langsam ist, haben Sie versucht, das Ergebnis dieser Zusammenstellung das Caching? Es würde den ersten Anruf nicht schneller machen, aber nachfolgende Anrufe könnten davon profitieren. Da Sie anscheinend nur Ausdrücke der Form 'x => x.Property' akzeptieren, haben Sie versucht, die Eigenschaft durch Reflektion zu erhalten, anstatt den Ausdruck zu kompilieren? –
Kann das Ergebnis der Kompilierung zwischengespeichert werden? Ich rufe die Methode auf, die den Ausdruck mit vielen verschiedenen Ausdrücken über die Codebasis kompiliert, so dass sie pro Anruf zwischengespeichert werden müssten. Ihr zweiter Punkt ist jedoch korrekt. Ich habe es geschafft, die Performance zu verbessern, indem ich die Compilation entferne und die Eigenschaft durch Reflektion erhalte, aber es ist immer noch nicht ideal, da der Property-Name zur Laufzeit noch berechnet wird (ich glaube, es sei denn, der Compiler macht etwas Funky). –