Heim >Backend-Entwicklung >C++ >Wie verfasse ich Ausdrücke, um „obj => obj.Prop' in „parent => parent.obj.Prop' umzuwandeln?

Wie verfasse ich Ausdrücke, um „obj => obj.Prop' in „parent => parent.obj.Prop' umzuwandeln?

Susan Sarandon
Susan SarandonOriginal
2025-01-18 07:02:17399Durchsuche

如何组合表达式将 "obj => obj.Prop" 转换为 "parent => parent.obj.Prop"

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn