以编程方式构建表达式而不编译它们

时间:2017-07-17 13:10:47

标签: c# linq lambda expression

我正在尝试从其他表达式构建表达式,使用one的结果作为另一个表达式的参数,但我想避免编译它们。鉴于我在代码下面有工作代码,如何删除.Compile().Invoke(位以使其一直保持为表达式?我可以看到它可能是Expression.Lambda()和Expression.Invoke()的混合但是确切的语法是什么?

Expression<Func<IActivator, TResult>> expressionA = ....;    
Expression<Func<T, TResult, TOut>> expressionB = ....;

Expression<Func<IActivator,TOut>> invoke_B_With_A = (activator) =>
    expressionB.Compile().Invoke(
        activator.Create<T>(), 
        expressionA.Compile().Invoke(activator)
    );

2 个答案:

答案 0 :(得分:0)

我认为你需要这样的东西:

var activator = Expression.Parameter(typeof(IActivator), "activator");
Expression<Func<IActivator,TOut>> invoke_B_With_A =
    (Expression<Func<IActivator,TOut>>) Expression.Lambda(Expression.Invoke(expressionB,
    activator,
    Expression.Invoke(expressionA, activator)
), new [] { activator });

答案 1 :(得分:0)

这种方式似乎有效,但你可以简化吗?

var activatorParam = Expression.Parameter(typeof(IActivator), "activator");
Expression<Func<IActivator, T>> builder = (activator) => activator.Create<T>();

var invoke_B_With_A = Expression.Lambda<Func<IActivator, TOut>>(
    Expression.Invoke(expressionB,
        Expression.Invoke(builder, activatorParam),
        Expression.Invoke(expressionA, activatorParam)
    ), activatorParam );