Obtenez de la valeur avec ASP.NET MVC Lambda Expression

J’essaie de créer mon propre assistant HTML qui intègre une expression (similaire à l’aide intégrée LabelFor . J’ai trouvé des exemples pour obtenir la valeur d’une propriété lorsque l’expression est similaire à ceci:

model => model.Forename 

Cependant, dans certains de mes modèles, je souhaite obtenir des propriétés dans des éléments enfants, par exemple

 model => mode.Person.Forename 

Dans ces exemples, je ne parviens pas à obtenir (facilement) la valeur de Forename. Quelqu’un peut-il me conseiller sur la manière dont je devrais obtenir cette valeur?

Merci

Si vous utilisez le même modèle que celui utilisé par la méthode LabelFor <>, l’expression sera toujours une expression LambdaExpression et vous pouvez simplement l’exécuter pour obtenir la valeur.

 var result = ((LambdaExpression)expression).Comstack().DynamicInvoke(model); 

Généralement, vous pouvez toujours encapsuler des expressions génériques dans LambdaExpressions, puis les comstackr et les appeler pour obtenir la valeur.

Si ce que vous voulez n’est pas la valeur de Forename, mais le champ lui-même (par exemple, pour imprimer la chaîne “Forename”), votre seule option est d’utiliser une forme d’expressionwalking. En C # 4, le framework fournit une classe appelée ExpressionVisitor qui peut être utilisée à cet effet, mais pour les versions antérieures du framework, vous devez l’implémenter vous-même. bb882521 (VS.90) .aspx

Vous cherchez la valeur?

Pourquoi ça ne marcherait pas?

  public object GetValue( Expression> accessor ) { var func = accessor.Comstack(); return func.Invoke(); } 

J’ai répondu à cette question séparément parce qu’il y avait deux choses que je n’aimais pas dans la réponse acceptée.

  1. Cela n’explique pas comment obtenir une référence au modèle, qui est une information essentielle lors de l’écriture d’un helper HTML personnalisé
  2. Si vous connaissez bien le type de délégué de l’expression lambda, il est inutile de le convertir en expression Lambda et d’utiliser DynamicInvoke. Dans mon expérience d’écriture des aides personnalisées, j’ai tendance à connaître d’avance les types.

Exemple où je sais dès le départ qu’il est conçu pour une expression lambda qui donne un tableau d’octets:

 public static MvcHtmlSsortingng MyHelper(this HtmlHelper htmlHelper, Expression> expression) { var comstackdExpression = expression.Comstack(); byte[] byteData = comstackdExpression(htmlHelper.ViewData.Model); ... ... ... return new MvcHtmlSsortingng(.......); }