..."/> ...">

Maison >développement back-end >C++ >Comment transformer des expressions pour des propriétés imbriquées dans les paramètres MVC ?

Comment transformer des expressions pour des propriétés imbriquées dans les paramètres MVC ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-18 06:57:08491parcourir

How to Transform Expressions for Nested Properties in MVC Parameters?

Générer des expressions d'attributs imbriquées dans les paramètres MVC

Le but est de créer une méthode qui convertit une expression comme "cust => cust.Name" en "parent => parent.obj.Name", où "parent" représente un enfant avec un modèle MVC de type "T" pour champs. Cette expression convertie doit être compatible en tant qu'argument d'une méthode MVC.

Expression combinée

Le cœur de la solution proposée est de combiner des expressions, de la même manière que les fonctions sont combinées. Le code suivant démontre le mécanisme de combinaison :

<code class="language-csharp">public static Expression<Func<TSource, TResult>> Compose<TSource, TIntermediate, TResult>(
    this Expression<Func<TSource, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    return Expression.Lambda<Func<TSource, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>

Cette méthode remplace l'instance d'expression par le code suivant :

<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>

Exemple pratique

Étant donné un sélecteur d'attribut :

<code class="language-csharp">Expression<Func<object, string>> propertySelector = cust => cust.Name;</code>

et un sélecteur de modèle :

<code class="language-csharp">Expression<Func<Model, Customer>> modelSelector = model => model.Customer;</code>

Vous pouvez les combiner comme suit :

<code class="language-csharp">Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>

En utilisant cette technique, vous pouvez transformer des expressions pour accéder aux propriétés imbriquées afin qu'elles correspondent aux paramètres de la méthode MVC.

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!

Déclaration:
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