【发布时间】:2012-03-19 20:10:25
【问题描述】:
我有一个Expression,用于从我的Model 中为我的视图获取项目列表。
我想做什么,给Expression 给List,我可以在Expression Tree 上向后向上一级获取父节点吗?
假设这是我的视图模型:
public class MyModel {
public MyClass myClass { get; set;}
}
...
public class MyClass {
public List<string> MyList { get; set;}
}
我有一个HtmlHelper,它需要一个Expression,如下所示将列表呈现到页面:
public static MvcHtmlString RenderList(this HtmlHelper<TModel> html, Expression<Func<TModel, IEnumerable<TItem>>> dataExpression)
{
var list = dataExpression.Compile()(html.ViewData.Model);
...
return MvcHtmlString.Create(...);
}
我这样称呼我的助手:
@model MyNamespace.Models.MyModel
@Html.RenderList(m => m.myClass.MyList)
这一切都很好,我的问题是,我可以将给定的Expression 指向List<string> 并获取它的父节点(MyClass)然后针对我的Model 编译它以获得它的价值。所以相当于这个Expression:
m => m.myClass
这是我尝试过的:
// This gets the correct expression
var exp = ((MemberExpression)this._dataExpression.Body).Expression;
// Create a parameter representing the type of the Model ?
var parameter = Expression.Parameter(typeof(TModel));
// Create lambda
var lambda = Expression.Lambda<Func<TModel, dynamic>>(exp, parameter);
// Try and compile against the view model
var obj = lambda.Compile()(html.ViewData.Model);
【问题讨论】:
标签: c# asp.net-mvc-3 lambda expression