«Присоединение» к выражению <TDelegate>для получения члена MemberExpression - PullRequest
0 голосов
/ 02 апреля 2012

Предположим, у меня есть:

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

и у меня есть Expression<Func<TIn,TOut>>, где TOut ограничено Foo. Как я могу создать Expression<Func<TIn, String>> для доступа к свойству Bar?

Редактировать

Причина, по которой я хочу, это написать HtmlHelper для ASP.NET MVC для сложного типа - например, MyExtension(this HtmlHelper that, Expression<Func<TIn, TOut>> expression), который затем вызывает другие методы расширения HtmlHelper для свойств сложного типа - например, EditorFor и т. Д.)

1 Ответ

1 голос
/ 03 апреля 2012

Вы можете использовать Body для доступа к телу первого выражения, затем Expression.Property() для доступа к свойству и, наконец, Expression.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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...