gpt4 book ai didi

c# - 将表达式> 转换为另一个表达式> 的正确方法

转载 作者:行者123 更新时间:2023-11-30 22:01:57 24 4
gpt4 key购买 nike

我有两个表达式。

我有一个 Expression<Func<Foo, bool>> 类型的谓词输入

我想将源表达式转换为类型 Expression<Func<Bar, bool>>

这样做的逻辑是什么?我一直在尝试使用 Expression.Convert()但我相信我做错了。

最佳答案

为了转换 Expression<Func<Foo, bool>>进入 Expression<Func<Bar, bool>>你需要一个Expression<Func<Bar, Foo>>以及处理转换。

您接下来要做的只是编写表达式。编写表达式比编写函数稍微复杂一些,其中一个可以简单地调用另一个将其结果作为参数传递。这里我们需要用第一个函数体替换第二个函数参数的所有实例:

public static Expression<Func<TFirstParam, TResult>>
Compose<TFirstParam, TIntermediate, TResult>(
this Expression<Func<TFirstParam, TIntermediate>> first,
Expression<Func<TIntermediate, TResult>> second)
{
var param = Expression.Parameter(typeof(TFirstParam), "param");

var newFirst = first.Body.Replace(first.Parameters[0], param);
var newSecond = second.Body.Replace(second.Parameters[0], newFirst);

return Expression.Lambda<Func<TFirstParam, TResult>>(newSecond, param);
}

这依赖于以下方法将一个表达式的所有实例替换为另一个表达式:

public static Expression Replace(this Expression expression,
Expression searchEx, Expression replaceEx)
{
return new ReplaceVisitor(searchEx, replaceEx).Visit(expression);
}
internal class ReplaceVisitor : ExpressionVisitor
{
private readonly Expression from, to;
public ReplaceVisitor(Expression from, Expression to)
{
this.from = from;
this.to = to;
}
public override Expression Visit(Expression node)
{
return node == from ? to : base.Visit(node);
}
}

现在我们可以做以下事情:

Expression<Func<Foo, bool>> predicate = GetPrediate();
Expression<Func<Bar, Foo>> selector = GetSelector();
Expression<Func<Bar, bool>> newPredicate = selector.Compose(predicate);

关于c# - 将表达式<Func<Foo, bool>> 转换为另一个表达式<Func<Bar, bool>> 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com