'追加'到Expression <tdelegate>以获取MemberExpression的成员</tdelegate>

时间:2012-04-02 19:51:32

标签: .net lambda

假设我有:

class Foo {
 public String Bar { get; set; }
}

我有一个Expression<Func<TIn,TOut>>,其中TOut被约束为Foo。如何创建Expression<Func<TIn, String>>来访问Bar属性?

修改

我想要的原因是为ASP.NET MVC编写一个复杂类型的HtmlHelper - 例如MyExtension(this HtmlHelper that, Expression<Func<TIn, TOut>> expression)然后为复杂类型的属性调用其他HtmlHelper扩展方法 - 例如EditorFor等)

1 个答案:

答案 0 :(得分:1)

您可以使用Body访问第一个表达式的正文,然后Expression.Property()访问该属性,最后Expression.Lambda()将它们全部合并到一个lambda中:

Expression<Func<TIn, string>> CreateExpression
    (Expression<Func<TIn, TOut>> expr)
{
    var barProperty = typeof(Foo).GetProperty("Bar");
    return Expression.Lambda<Func<TIn, string>>(
        Expression.Property(expr.Body, barProperty), expr.Parameters);
}

如果你可以使用LINQKit,这有点简单(别忘了using LinqKit;):

public Expression<Func<TIn, string>> CreateExpression
    (Expression<Func<TIn, TOut>> expr)
{
    Expression<Func<TIn, string>> tmp = x => expr.Invoke(x).Bar;
    return tmp.Expand();
}