c# - 从表达式中获取父成员

标签 c# asp.net-mvc-3 lambda expression

我有一个 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/

相关文章:

c# - 屏蔽电话号码的文本框 View

asp.net-mvc-3 - MVC3虚拟目录 View 文件夹非常慢

c++ - 如何将函数和参数包转发到 lambda、std::thread 的构造函数中?

c# - 将输出重定向到文本文件 c#

c# - Entity Framework DbContext : Value cannot be null, 参数名称来源

c# - 在没有回发的客户端过滤 Grid.Mvc

javascript - 如何从 javascript 将 html img 添加到页面但不在 javascript 中对其进行硬编码

jquery - MVC 3,重用部分 View 和jquery,不与DOM冲突

java - Lambda 表达式还是方法引用?

python - 如何在使用 AWS Lambda 中的 POST 方法和正文执行 307 重定向时传递请求正文?