use*_*667 8 html c# asp.net-mvc lambda html-helper
我正在尝试创建自己的HTML Helper,它接受一个表达式(类似于内置的LabelFor <>帮助器.我已经找到了在表达式类似于此时获取属性值的示例:
model => model.Forename
Run Code Online (Sandbox Code Playgroud)
但是,在我的一些模型中,我想获取子元素中的属性,例如
model => mode.Person.Forename
Run Code Online (Sandbox Code Playgroud)
在这些例子中,无论如何我都找不到(轻松)获取Forename的值.任何人都可以建议我应该如何获得这个价值.
谢谢
AHM*_*AHM 14
如果您使用的是LabelFor <>方法使用的相同模式,那么表达式将始终是LambdaExpression,您只需执行它即可获取值.
var result = ((LambdaExpression)expression).Compile().DynamicInvoke(model);
Run Code Online (Sandbox Code Playgroud)
通常,您始终可以在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();
}
Run Code Online (Sandbox Code Playgroud)
我已经单独回答了这个问题,因为我不喜欢接受的答案的两件事。
我预先知道它是为生成字节数组的 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(.......);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8490 次 |
| 最近记录: |