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!