Как построить () => x.prop лямбда-выражение динамически? - PullRequest
4 голосов
/ 27 января 2011

У меня есть код как

DepartmentPaperConsumption dto = null;

потом у меня результат NHibernate QueryOver, и я хочу заказать его

result.OrderByAlias(() => dto.TotalColorCopys);

но я хочу иметь возможность динамически указывать любое свойство dto со строкой. Я попытался использовать Dynamic LINQ , но мне кажется, что я просто не могу его получить. Я также пытался построить LambdaExpression с нуля - тоже безуспешно. Буду признателен за любую помощь.

Ответы [ 3 ]

9 голосов
/ 27 января 2011

Вы можете увидеть, как построить лямбду здесь , но это действительно довольно просто в вашем случае:

var arg = Expression.Constant(null, typeof(DepartmentPaperConsumption));
var body = Expression.Convert(Expression.PropertyOrField(arg, propertyName),
    typeof(object));
var lambda = Expression.Lambda<Func<object>>(body);

Сложная задача - вызвать OrderByAlias - можно использовать MakeGenericMethod, как показано в ссылке выше.

3 голосов
/ 27 января 2011

хорошо используйте динамический linq, как вы написали, или используйте дерево выражений http://msdn.microsoft.com/en-us/library/bb397951.aspx

я не думаю, что есть другие решения

2 голосов
/ 27 января 2011

Мне удалось найти один путь самому, но это выглядит больше обходного пути, версия Марка намного проще. Я приму ответ Марка, как только опробую его. Вот мой обходной путь:

public class MemberModifier : ExpressionVisitor
{
    public Expression Modify(Expression expression)
    {
        return Visit(expression);
    }

    protected override Expression VisitMember(MemberExpression node)
    {
        var t = typeof (DepartmentPaperConsumption);
        var memberInfo = t.GetMember("TotalPages")[0];
        return Expression.MakeMemberAccess(node.Expression, memberInfo);
    }
}

и затем в коде

        Expression<Func<object>> exp = () => dto.TotalColorPrints;
        var mod = new MemberModifier();
        var modEx = mod.Modify(exp);
        result.OrderByAlias((Expression<Func<object>>)modEx)

MemberModifier является только необработанным прототипом, он должен быть более общим и не зависеть от DepartmentConsidity и без жестко заданных «TotalPages»

...