从 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 而不是反射?