gpt4 book ai didi

c# - 更改 LambdaExpression 中的参数名称只是为了显示

转载 作者:可可西里 更新时间:2023-11-01 08:08:28 27 4
gpt4 key购买 nike

假设我有这样一个表达式:

Expression<Predicate<T>> exp

如果我分配以下表达式:

a => a.First() != 0

然后我调用 exp.ToString() 我将准确获得我传递的表达式,这非常好,但是,假设我们想用一些东西更改我们用于“a”的名称否则,我们怎么办?字符串替换不会在所有情况下都有效(它在上面的示例中有效,但是如果参数被称为 'i' 怎么办?)是否可以在不影响表达式语义的情况下仅进行参数名称替换、运行时?

更新@PhilKlein 工作得很好,但需要框架 4。但是如果我们需要以框架 3.5 为目标,我们可以使用 ExpressionVisitor。来自 Matt Warren 的类(class),只需将 Visit 方法从 protected 修改为 public。

最佳答案

它既快速又肮脏,但假设您使用的是 .NET 4.0,您可以创建以下内容:

public class PredicateRewriter
{
public static Expression<Predicate<T>> Rewrite<T>(Expression<Predicate<T>> exp, string newParamName)
{
var param = Expression.Parameter(exp.Parameters[0].Type, newParamName);
var newExpression = new PredicateRewriterVisitor(param).Visit(exp);

return (Expression<Predicate<T>>) newExpression;
}

private class PredicateRewriterVisitor : ExpressionVisitor
{
private readonly ParameterExpression _parameterExpression;

public PredicateRewriterVisitor(ParameterExpression parameterExpression)
{
_parameterExpression = parameterExpression;
}

protected override Expression VisitParameter(ParameterExpression node)
{
return _parameterExpression;
}
}
}

然后按如下方式使用它:

var newExp = PredicateRewriter.Rewrite(exp, "b");
newExp.ToString(); // returns "b => (b.First() == 0)" in your case

关于c# - 更改 LambdaExpression 中的参数名称只是为了显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540954/

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