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

C# Expression Tree Accessing Result from another Expression

我有下面的方法给出了 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 方法的 return 结果。

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

        }

我想从上面的方法调用中获取 return 结果的表达式,并访问它的属性,例如 IsSuccess,它本身可以是一个二进制表达式。所有这些都没有编译表达式。

最终目标: 让我们将其视为方法调用,方法 M1 returns 结果 R1 和方法 M2 使用此结果 R1,(M2) 必须创建自己的结果 R2,但方法 M2 必须对 R1 的 IsSuccess 属性 执行 Epxression.Or() 并使用其他一些布尔表达式来创建 R2,因此我们需要表达式。所以我们只需要从 M2 中的 R1 获取 IsSuccess 属性 然后使用它。

请建议我该如何实现?

提前致谢。

but in UseExpression method I'm creating new expression which won't be using compiled expression, so it all has to be expressions

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

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

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