从 ASP.NET MVC Lambda 表达式中获取价值

Posted

技术标签:

【中文标题】从 ASP.NET MVC Lambda 表达式中获取价值【英文标题】:Get value from ASP.NET MVC Lambda Expression 【发布时间】:2011-04-18 07:40:42 【问题描述】:

我正在尝试创建自己的 html 助手,它接受一个表达式(类似于内置的 LabelFor 助手。当表达式类似于此时,我找到了获取属性值的示例:

model => model.Forename

但是,在我的某些模型中,我想获取子元素中的属性,例如

model => mode.Person.Forename

在这些示例中,我无论如何都找不到(轻松)获得 Forename 的值。任何人都可以建议我应该如何获得这个价值。

谢谢

【问题讨论】:

【参考方案1】:

如果您使用的模式与 LabelFor 方法使用的模式相同,则表达式将始终是 LambdaExpression,您只需执行它即可获取值。

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

通常,您始终可以将泛型表达式包装在 LambdaExpressions 中,然后编译并调用它们以获取值。

如果您想要的不是 Forename 的值,而是字段本身(用于打印字符串“Forename”),那么您唯一的选择是使用某种形式的表达式遍历。在 C#4 中,框架提供了一个名为 ExpressionVisitor 的类,可用于此目的,但对于框架的早期版本,您必须自己实现它 - 请参阅:http://msdn.microsoft.com/en-us/library/bb882521(VS.90).aspx

【讨论】:

【参考方案2】:

您正在寻找价值?

为什么这不起作用?

    public object GetValue<T>( Expression<Func<T>> accessor )
    
        var func = accessor.Compile();

        return func.Invoke();
    

【讨论】:

【参考方案3】:

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

    它没有说明如何获取对模型的引用,这是编写自定义 html 帮助程序时的关键信息 如果您预先知道 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(.......);
    

【讨论】:

以上是关于从 ASP.NET MVC Lambda 表达式中获取价值的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 ASP.NET MVC 中使用 lambdas 而不是反射?

ASP.NET MVC 小牛之路]02

干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结

asp.net中如何拼接lambda表达式查询条件?

ASP.NET EF(LINQ/Lambda查询)

ASP.NET Mvc开发之EF延迟加载