Heim >Backend-Entwicklung >C++ >Wie verfasse ich Ausdrücke, um „obj => obj.Prop' in „parent => parent.obj.Prop' umzuwandeln?
Kombinieren Sie Ausdrücke, um „obj => obj.Prop“ in „parent => parent.obj.Prop“ zu konvertieren
Der vorhandene Ausdruck „obj => obj.Prop“ kann in einen neuen Ausdruck „parent =>“ umgewandelt werden, indem der ursprüngliche Ausdruck mit einem Ausdruck kombiniert wird, der „obj“ aus „parent“ parent.obj.Prop“ extrahiert. .
Benutzerdefinierte Ausdruckskombinationsfunktion
Um Kombinationen zu erstellen, können Funktionen mithilfe benutzerdefinierter Ausdrücke kombiniert werden:
<code class="language-csharp">public static Expression<Func<T, TResult>> Compose<T, TIntermediate, TResult>( this Expression<Func<T, TIntermediate>> first, Expression<Func<TIntermediate, TResult>> second) { return Expression.Lambda<Func<T, TResult>>( second.Body.Replace(second.Parameters[0], first.Body), first.Parameters[0]); }</code>
Diese Funktion kombiniert zwei Ausdrücke, indem sie Verweise auf die Parameter des zweiten Ausdrucks durch den Hauptteil des ersten Ausdrucks ersetzt.
Ausdrucksersatz
Um einen Ausdruck zu ersetzen, können Sie den benutzerdefinierten Ausdrucks-Accessor verwenden:
<code class="language-csharp">public class ReplaceVisitor : ExpressionVisitor { private readonly Expression from, to; public ReplaceVisitor(Expression from, Expression to) { this.from = from; this.to = to; } public override Expression Visit(Expression ex) { if (ex == from) return to; else return base.Visit(ex); } } public static Expression Replace(this Expression ex, Expression from, Expression to) { return new ReplaceVisitor(from, to).Visit(ex); }</code>
Dieser Accessor ersetzt alle Vorkommen eines Ausdrucks durch einen anderen Ausdruck.
Kombinierter Ausdruck
Mit den oben genannten Funktionen ist es möglich, den ursprünglichen Ausdruck und den aus „obj“ extrahierten Ausdruck zu kombinieren:
<code class="language-csharp">Expression<Func<Customer, object>> propertySelector = cust => cust.Name; Expression<Func<CustomerModel, Customer>> modelSelector = model => model.Customer; Expression<Func<CustomerModel, object>> magic = modelSelector.Compose(propertySelector);</code>
Der generierte Ausdruck „magic“ wählt nun die Eigenschaft „Name“ aus dem „Customer“ im „CustomerModel“ aus.
Diese überarbeitete Antwort behält die Struktur und Sprache des ursprünglichen Inhalts bei, während Sätze neu formuliert und Synonyme verwendet werden, um eine Paraphrasierung zu erreichen. Das Bild bleibt an der gleichen Position und im gleichen Format.
Das obige ist der detaillierte Inhalt vonWie verfasse ich Ausdrücke, um „obj => obj.Prop' in „parent => parent.obj.Prop' umzuwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!