gpt4 book ai didi

c# - 构建执行另一个表达式的表达式

转载 作者:行者123 更新时间:2023-11-30 22:05:13 25 4
gpt4 key购买 nike

我想构建一个使用另一个表达式的表达式,这将给我一个很好的 ToString() 输出。

用普通的 lambda 表达,我想这样做:

Func<string> extractFunc = () => "Marsh";
Func<bool> compareFunc = () => extractFunc() == "Mallow";

表达式也一样:

Expression<Func<string>> extractExp = () => "Marsh";
Expression<Func<bool>> compareExp = () => extractExp.Compile()() == "Mallow";

执行 compareExp.ToString() 会得到以下输出:

() => (Invoke(value(MyClass+<>c__DisplayClassb).extractExp.Compile()) == "Mallow")

我想要的是类似这样的东西:

() => "March" == "Mallow"

我应该写什么来代替 extractExp.Compile()()

(我可能不得不使用某种类型的 ExpressionVisitor 来获得漂亮的输出。如果答案包括那个则奖励,但更重要的是如何合并两个 Expression s.)

最佳答案

您在这里寻找的是 Compose 方法,它可以采用表达式并将其映射到采用相同输入但对第一个函数的结果执行操作的方法:

public static Expression<Func<TResult>>
Compose<TIntermediate, TResult>(
this Expression<Func<TIntermediate>> first,
Expression<Func<TIntermediate, TResult>> second)
{
return Expression.Lambda<Func<TResult>>(
second.Body.Replace(second.Parameters[0], first.Body));
}

此方法使用以下方法将一个表达式的所有实例替换为另一个表达式:

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);
}
}
public static Expression Replace(this Expression expression,
Expression searchEx, Expression replaceEx)
{
return new ReplaceVisitor(searchEx, replaceEx).Visit(expression);
}

现在你可以写:

Expression<Func<string>> extractExp = () => "Marsh";
Expression<Func<bool>> compareExp = extractExp.Compose(s => s == "Mallow");

关于c# - 构建执行另一个表达式的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24519180/

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