【问题标题】:C# Expression Tree Accessing Result from another ExpressionC# 表达式树从另一个表达式访问结果
【发布时间】:2018-04-09 18:18:01
【问题描述】:

我有下面给出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

        }

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

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

请建议我如何实现它?

提前致谢。

【问题讨论】:

  • 如果你想得到一个表达式的执行结果,你必须编译它。
  • 请尝试解释您为什么要这样做。最终目标是什么?
  • 是的,在某些时候,我会编译表达式,但在 UseExpression 方法中,我正在创建新的表达式,它不会使用已编译的表达式,所以这一切都必须是表达式,最后我'将进行编译。
  • @Daniel 更新问题。

标签: c# expression expression-trees


【解决方案1】:

但在 UseExpression 方法中,我正在创建不会使用编译表达式的新表达式,所以它必须是表达式

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

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

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

【讨论】:

  • 感谢您的回答。在我的情况下,我需要在 UseExpression 方法下访问 Result 类的 IsSuccess 属性。仅调用 GetExpression 方法返回的表达式将给出一个复杂类型,我想访问它的属性。
  • @user7784348 你有一个具体的例子我们可以在这里解决吗?如果没有具体的例子,很难回答这些问题。您能否在“Do something to retrun expression”中添加一些虚拟代码,并举例说明UseExpression 想要用它做什么?
  • 我创建了一个示例项目并上传到这个link。如果您有任何疑问,请告诉我。提前致谢。
  • @user7784348 也许是这样的? gist.github.com/mgravell/26a9ee17d720e5fda7c1e005fba4e70c - 在这里,我基本上探索了树以解决 IsSuccess 分配,使用 AndAlso 组合它们,然后使用组合结果构建新绑定。但是还有其他方法可以做同样的事情
  • 非常感谢。它完美地工作!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多