Maison > développement back-end > C++ > Comment composer des expressions pour transformer « obj => obj.Prop » en « parent => parent.obj.Prop » ?

Comment composer des expressions pour transformer « obj => obj.Prop » en « parent => parent.obj.Prop » ?

Susan Sarandon
Libérer: 2025-01-18 07:02:17
original
405 Les gens l'ont consulté

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

Combinez des expressions pour convertir "obj => obj.Prop" en "parent => parent.obj.Prop"

L'expression existante "obj => obj.Prop" peut être convertie en une nouvelle expression "parent => en combinant l'expression d'origine avec une expression qui extrait "obj" de "parent" parent.obj.Prop" .

Fonction de combinaison d'expressions personnalisées

Pour créer des combinaisons, les fonctions peuvent être combinées à l'aide d'expressions personnalisées :

<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>
Copier après la connexion

Cette fonction combine deux expressions en remplaçant les références aux paramètres de la deuxième expression par le corps de la première expression.

Remplacement d'expression

Pour remplacer une expression, vous pouvez utiliser l'accesseur d'expression personnalisé :

<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>
Copier après la connexion

Cet accesseur remplace toutes les occurrences d'une expression par une autre expression.

Expression combinée

En utilisant les fonctions ci-dessus, il est possible de combiner l'expression originale et l'expression extraite "obj" :

<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>
Copier après la connexion

L'expression générée "magic" sélectionnera désormais la propriété "Name" du "Customer" dans le "CustomerModel".

Cette réponse révisée conserve la structure et le langage du contenu original tout en reformulant les phrases et en utilisant des synonymes pour réaliser la paraphrase.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal