繁体   English   中英

从ASP.NET MVC Lambda Expression获取价值

[英]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();
    }

我已经单独回答了这个问题,因为有两件事我不喜欢接受的答案。

  1. 它没有解释如何在编写自定义html帮助程序时获取对模型的引用,该模型是关键信息
  2. 如果您事先知道lambda表达式的委托类型是什么,则将其强制转换为Lambda表达式并使用DynamicInvoke是不必要的。 根据我编写自定义助手的经验,我倾向于先了解类型。

我之前知道的示例是为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM