我正在尝试从其他表达式构建表达式,使用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)
);
答案 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 );