Ich bin neu in Ausdrücke und ich würde gerne wissen, ob es irgendwie möglich ist, meinen Ausdruck zu konvertieren
Nehmen wir an, in diesem Beispiel ist mein TModel vom Typ Kunde und hat es irgendwo wie folgt zugewiesen:
%Vor%zu etwas wie
%Vor%Kurz gesagt, möchte ich irgendwie einen Ausdruck erstellen und kompilieren, der den durch meinen Getter-Ausdruck angegebenen Kundennamen auf einen bestimmten Wert setzt.
Geänderte Version. Diese Klasse ist wahrscheinlich besser als viele andere, die Sie finden können :-) Dies ist, weil diese Version direkte Eigenschaften ( p => p.B
) (wie alle anderen :-)), verschachtelte Eigenschaften ( p => p.B.C.D
), Felder (beide " Terminal "und" in der Mitte ", also in p => p.B.C.D
sowohl B
und D
könnten Felder sein) und" innerer "Casting von Typen (also p => ((BType)p.B).C.D
und p => (p.B as BType).C.D)
. Das einzige was nicht ist unterstützt wird das Casting des "terminal" -Elements (also kein p => (object)p.B
).
Es gibt zwei "Codepathe" im Generator: für einfache Ausdrücke ( p => p.B
) und für "verschachtelte" Ausdrücke. Es gibt Code-Varianten für .NET 4.0 (mit dem Ausdruckstyp Expression.Assign
). Von einigen Benchmarks von mir sind die schnellsten Delegaten: "simple" Delegate.CreateDelegate
für Eigenschaften, Expression.Assign
für Felder und "einfache" FieldSetter
für Felder (dieser ist nur ein wenig langsamer als Expression.Assign
für Felder). Unter .NET 4.0 sollten Sie also den gesamten mit 3,5 markierten Code wegnehmen.
Ein Teil des Codes gehört nicht mir. Die ursprüngliche (einfache) Version basierte auf dem Fluent NHibernate-Code (aber sie unterstützte nur direkte Eigenschaften), einige andere Teile basieren auf Code aus Wie setze ich einen Feldwert in einem C # Ausdruck Baum? und Zuordnung in .NET 3.5-Ausdrucksbäumen .
%Vor%Ich habe diese Hilfsmethode, die die Eigenschafteninformation für eine Eigenschaft zurückgibt:
%Vor% Verwendung: GetPropertyInfo((MyClass c) => c.PropertyName);
Sie können dann mit PropertyInfo den Wert der Eigenschaft für eine Klasse festlegen.
Sie müssen den Code an Ihre Bedürfnisse anpassen, aber hoffentlich wird es helfen.
Da die richtige Antwort für mich nicht funktionierte (Sammlungen im Ausdruck), sondern mich in die richtige Richtung drängte, musste ich das sehr gründlich untersuchen und ich denke, dass ich eine Methode entwickelt habe, die Setter für buchstäblich jeden erzeugen kann Mitgliedsausdruck.
Bei Eigenschaften und Feldern verhält es sich genauso wie die markierte Antwort (ich glaube jedoch, dass es viel transparenter ist).
Es hat zusätzliche Unterstützung für Listen und Wörterbücher - bitte in den Kommentaren sehen.
%Vor%Tags und Links c# lambda expression