假设我有:
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等)
答案 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();
}