【问题标题】:Getting Parent Member from Expression从表达式中获取父成员
【发布时间】:2012-03-19 20:10:25
【问题描述】:

我有一个Expression,用于从我的Model 中为我的视图获取项目列表。 我想做什么,给ExpressionList,我可以在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&lt;string&gt; 并获取它的父节点(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


    【解决方案1】:

    以下应该有效:

    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;
    
        ...
    }
    

    显然,您应该在此代码中添加最少的错误检查,为简洁起见,我在此特意省略了。

    【讨论】:

      【解决方案2】:

      您必须在新的 lambda 表达式中使用相同的参数表达式:

      var lambda = Expression.Lambda<Func<MyModel, dynamic>>(exp,
          this._dataExpression.Parameters);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        相关资源
        最近更新 更多