C#表达式树从另一个表达式访问结果

时间:2018-04-09 09:57:57

标签: c# expression expression-trees

我有以下方法,它提供Expression<Func<T, Result<T>>>类型。

public Expression<Func<T, Result<T>>> GetExpression<T>()
{
    //Do something to retrun expression
}



public class Result<T>
    {
        public bool IsSuccess { get; set; }

        public string Message { get; set; }

        public Result<T> ChildResult { get; set; }
    }

现在我有另一个方法,如下所示,我想访问GetExpression方法的返回结果。

public void UseExpression<T>()
        {
            var expression = GetExpression<T>();

            //I want to get the expression for return Result<T> from above method call and get access to it's properties like IsSuccess which can itself be a binary expression

        }

我希望从上面的方法调用中获取返回Result的表达式,并获取它的属性,如IsSuccess,它本身可以是二进制表达式。所有这些都没有编译表达式。

结束目标:让我们将其视为方法调用,方法M1返回结果R1,方法M2使用此结果R1,其中(M2)必须创建自己的结果R2但是方法M2必须在R1的IsSuccess属性上执行Epxression.Or()和其他一些bool表达式来创建R2,所以我们需要express。所以我们需要从M2中的R1获取IsSuccess属性然后使用它。

请建议我如何实现它?

提前致谢。

1 个答案:

答案 0 :(得分:1)

  

但是在UseExpression方法中我创建了一个不会使用编译表达式的新表达式,所以这一切都必须是表达式

有两种方法可以做到这一点。

第一种方法是使用expression.Body为您提供内部表达式树, 重新使用expression.Parameters来构建您的 new 表达式(假设它仍然采用相同的参数类型),或使用ExpressionVisitor 替换参数遍及当前.Body的参数它应该现在。如果你有一个具体的例子,说明你正在尝试做什么,我可以用一个完整的例子说明这一点。

第二种方法是在新表达式中使用.Invoke,将整个expression作为第一个参数传递,并提供 new 表达式想要用作的任何内容参数为parameters。但是,如果将其传递给类似EF的东西,那么稍差一点,并且它可能决定不支持它。如果你打算打电话给.Compile,你应该没事。