我有以下方法,它提供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属性然后使用它。
请建议我如何实现它?
提前致谢。
答案 0 :(得分:1)
但是在UseExpression方法中我创建了一个不会使用编译表达式的新表达式,所以这一切都必须是表达式
有两种方法可以做到这一点。
第一种方法是使用expression.Body
为您提供内部表达式树, 重新使用expression.Parameters
来构建您的 new 表达式(假设它仍然采用相同的参数类型),或使用ExpressionVisitor
替换参数遍及当前.Body
的参数它应该现在。如果你有一个具体的例子,说明你正在尝试做什么,我可以用一个完整的例子说明这一点。
第二种方法是在新表达式中使用.Invoke
,将整个expression
作为第一个参数传递,并提供 new 表达式想要用作的任何内容参数为parameters
。但是,如果将其传递给类似EF的东西,那么稍差一点,并且它可能决定不支持它。如果你打算打电话给.Compile
,你应该没事。