[英]Get value from ASP.NET MVC Lambda Expression
我正在尝试创建自己的HTML Helper,它接受一个表达式(类似于内置的LabelFor <>帮助器。我已经找到了在表达式类似于此时获取属性值的示例:
model => model.Forename
但是,在我的一些模型中,我想获取子元素中的属性,例如
model => mode.Person.Forename
在这些例子中,无论如何我都找不到(轻松)获取Forename的值。 任何人都可以建议我应该如何获得这个价值。
谢谢
如果您使用的是LabelFor <>方法使用的相同模式,那么表达式将始终是LambdaExpression,您只需执行它即可获取值。
var result = ((LambdaExpression)expression).Compile().DynamicInvoke(model);
通常,您始终可以在LambdaExpressions中包装泛型表达式,然后编译并调用它们以获取值。
如果你想要的不是Forename的值,而是字段本身(fx。打印出字符串“Forename”)那么你唯一的选择是使用某种形式的表达式。 在C#4中,框架提供了一个名为ExpressionVisitor的类,可以用于此,但是对于框架的早期版本,您必须自己实现它 - 请参阅: http : //msdn.microsoft.com/en-us/library/ bb882521(VS.90)的.aspx
你在寻找价值?
为什么这不起作用?
public object GetValue<T>( Expression<Func<T>> accessor )
{
var func = accessor.Compile();
return func.Invoke();
}
我已经单独回答了这个问题,因为有两件事我不喜欢接受的答案。
我之前知道的示例是为lambda表达式设计的,它产生一个字节数组:
public static MvcHtmlString MyHelper<TModel>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, byte[]>> expression)
{
var compiledExpression = expression.Compile();
byte[] byteData = compiledExpression(htmlHelper.ViewData.Model);
...
...
...
return new MvcHtmlString(.......);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.