gpt4 book ai didi

c# - “注入(inject)”一个表达式到另一个

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

我有一个这样定义的表达式:

Expression<Func<T1, T2, bool>> firstExpression;

还有一个像这样:

Expression<Func<T1, bool>> secondExpression;

T2 是我知道的值,T1 不是。我想要的是根据参数 T2 的值将第一个表达式变成第二个表达式。如果它是常规的 Linq,它将是这样的:

var t2 = "Something I know";
secondExpression = t1 => fistExpression(t1, t2);

我如何使用 System.Linq.Expressions 执行此操作?

最佳答案

您可以使用表达式 visitor 完成此操作:

public static class EmitUtils
{
private class ParameterReplacerVisitor : ExpressionVisitor
{
private ParameterExpression _source;
private Expression _target;

public ParameterReplacerVisitor(ParameterExpression source, Expression target)
{
_source = source;
_target = target;
}

public override Expression Visit(Expression node) =>
node == _source
? _target
: base.Visit(node);
}

public static Expression ReplaceParameter(Expression body, ParameterExpression srcParameter, Expression dstParameter) =>
new ParameterReplacerVisitor(srcParameter, dstParameter).Visit(body);

public static Expression<Func<T1, T3>> BuildClosure<T1, T2, T3>(Expression<Func<T1, T2, T3>> src, T2 closureValue)
{
var constExpression = Expression.Constant(closureValue, typeof(T2));
var body = ReplaceParameter(src.Body, src.Parameters[1], constExpression);
return Expression.Lambda<Func<T1, T3>>(body, src.Parameters[0]);
}

}

这是示例用法:

        [Test]
public void ClosureTest()
{
Expression<Func<int, string, bool>> CheckStringLength = (len, str) => str.Length < len;
var constString = "some string";
var result = EmitUtils.BuildClosure(CheckStringLength, constString);
Assert.That(result.Compile().Invoke(100), Is.True);
}

关于c# - “注入(inject)”一个表达式到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58135849/

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