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
Libérer: 2025-01-18 06:57:08
original
491 Les gens l'ont consulté

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

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

Exemple pratique

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

<code class="language-csharp">Expression<Func<object, string>> propertySelector = cust => cust.Name;</code>
Copier après la connexion

et un sélecteur de modèle :

<code class="language-csharp">Expression<Func<Model, Customer>> modelSelector = model => model.Customer;</code>
Copier après la connexion

Vous pouvez les combiner comme suit :

<code class="language-csharp">Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>
Copier après la connexion

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!

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