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.
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(.......); }