我有一个 Expression
用于从我的 Model
中获取项目列表对于我的观点。
我想做的是 Expression
对于 List
,我可以在 Expression Tree
上倒退向上吗?一级获取父节点?
假设这是我的 View 模型:
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
编译它得到它的值(value)。所以相当于这个 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);
最佳答案
以下应该有效:
public static IHtmlString RenderList<TModel, TItem>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, IEnumerable<TItem>>> dataExpression
)
{
var parentEx = ((MemberExpression)dataExpression.Body).Expression;
var lambda = Expression.Lambda<Func<TModel, object>>(parentEx, dataExpression.Parameters[0]);
var value = ModelMetadata.FromLambdaExpression(lambda, html.ViewData).Model;
...
}
显然,您应该为此代码添加最少的错误检查,为简洁起见,我在此处故意省略了这一点。
关于c# - 从表达式中获取父成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777155/