wie schaffen Ausdruck Baum / lambda für eine Tiefe Eigenschaft aus einem string
Gegeben ein string: "Person.Adresse.Postleitzahl - " ich möchte in der Lage sein, um die get/set-dieses PLZ-Eigenschaft auf eine Instanz von Person. Wie kann ich dies tun? Meine Idee war split die Zeichenfolge "." und dann die Iteration über die Bauteile auf der Suche nach der Immobilie auf den vorherigen geben, dann erstellen Sie einen Ausdruck-Baum, der würde ungefähr so Aussehen (Entschuldigung für die pseudo-syntax):
(person => person.Address) address => address.Postcode
Ich habe echte Schwierigkeiten, konkret die Schaffung der Ausdruck, der Baum aber! Wenn dies der beste Weg ist, kann jemand empfehlen, wie man das macht, oder gibt es eine einfachere alternative?
Dank
Andrew
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public Address Address{ get; set; }
public Person()
{
Address = new Address();
}
}
public class Address
{
public string Postcode { get; set; }
}
InformationsquelleAutor Andrew Bullock | 2009-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum Sie nicht verwenden Sie Rekursion? So etwas wie:
Denken Sie nur daran, dass C# ist nicht tail-rekursiv, so dass Sie könnte am Ende mit StackOverflow-exception.
InformationsquelleAutor Konstantin Savelev
Es klingt wie Sie sortiert sind mit regelmäßigen Reflexion, aber zur info, der code zum erstellen eines Ausdrucks für verschachtelte Eigenschaften sehr ähnlich diese order-by-code.
Beachten Sie, dass ein Wert festgelegt ist, müssen Sie verwenden
GetSetMethod()
auf dem Grundstück und berufen, - es gibt keine eingebaute Ausdruck zum zuweisen von Werten nach Konstruktion (obwohl es unterstützt 4.0).(edit) etwa so:
Funktioniert gut - aber wenn die Leistung ist ein Problem, siehe stackoverflow.com/a/14708196/188926
InformationsquelleAutor Marc Gravell
Wenn jemand interessiert ist, in der performance trade-off zwischen der einfache reflektion Ansatz (auch schöne Beispiele hier und hier) und Marc Ausdruck-Gebäude Ansatz...
Meine test waren immer ein relativ tiefes Grundstück (A. B. C. D. E) 10.000 mal.
Offensichtlich ist dies ein sehr spezifischer test, und ich habe es nicht als Optimierungen oder Eigenschaften, aber ich denke, ein 26x Leistung trifft, ist bemerkenswert.
Func<,>
erstellt überILGenerator
können sehr schnell sein, solange es zwischengespeichert und nicht neu erstellt wird pro AufrufVereinbart, es ist definitiv caching-Potenzial, und dieser test ist sehr primitiv, dass es nur blind fordert die BuildGet Methode 1000 mal. Ich denke, es ist nur eine Warnung für die Kopie-rollenwechslern (wie mich!) die Schnellste OOTB-Lösung.
Ich bekam ähnliche Ergebnisse in LinqPad -- gist.github.com/zaus/6884806; ich dachte, es könnte helfen, wenn der Ausdruck nicht die ganze
PropertyInfo
, hat es aber nicht (sieht einfach "sauberer")InformationsquelleAutor Dunc
Den Sie betrachten möchten, die Bereitstellung Ihrer eigenen PropertyDescriptor über TypeConverter oder einer anderen Quelle.
Ich umgesetzt haben, ist genau das, was Sie beschreiben, für das aktuelle Projekt (sorry, Werbung, sonst würde ich teilen), durch Ableitung vom BindingSource, und die Bereitstellung der Informationen über es.
Die Idee ist wie folgt:
Alles, was Sie tun müssen, ist, dass, sobald Sie haben die Art ist kaum zu schaffen 'Stapel' für die getter und setter der Eigenschaften, und diejenigen, die Sie sammeln können, über das Wandern der eigenschaftsbaum der Typ und seine Eigenschaften Breite zum ersten mal, die Begrenzung der Tiefe auf eine angegebene Anzahl von Ebenen und entfernen von Zirkelbezügen je nach Ihrer Datenstrukturen.
Ich bin mit dieser Recht erfolgreich mit Linq2SQL-Objekte und-in Kombination mit Ihrer verbindlichen Listen 🙂
InformationsquelleAutor leppie
Expression Tree
InformationsquelleAutor