ExpressionFuncTModel, String zu ExpressionActionTModel "Getter" zu "Setter"

8

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.

    
Michiel Cornille 11.10.2011, 09:10
quelle

5 Antworten

10

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%     
xanatos 11.10.2011, 09:28
quelle
2
%Vor%     
Thomas Levesque 11.10.2011 10:07
quelle
1

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.

    
Joey 11.10.2011 09:22
quelle
0

das ist mein Weg

%Vor%     
IlPADlI 10.07.2014 05:45
quelle
0

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%     
veb 29.09.2014 14:36
quelle

Tags und Links