gpt4 book ai didi

c# - 减少 LambdaExpression 签名

转载 作者:行者123 更新时间:2023-11-30 18:32:51 25 4
gpt4 key购买 nike

我想不出更好的方式来表达这个问题,但我想做的是从 Expression<Func<MyObject, FilterObject, bool>> 减少 LambdaExpression 的签名。至 Expression<Func<MyObject, bool>>通过处理 FilterObject 的实例在评估 LambdaExpression 之前。

这是一个简单的例子:

AddFilter("Filter Name", FilterTypes.All,
(x, y) => GetConjunctionResult(
x.PersonA.IsSomething, x.PersonB.IsSomething, y.ConjunctionType));

private static bool GetConjunctionResult(bool personA, bool personB,
ConjunctionType conjunctionType)
{
switch (conjunctionType)
{
case ConjunctionType.Both:
return personA && personB:
case ConjunctionType.Either:
return personA && personB;
case ConjunctionType.PersonA:
return personA;
case ConjunctionType.PersonB:
return personB;
case ConjunctionType.Neither:
return !personA && !personB;
}
}

所以我想要 AddFilter 的重载创建 FilterObject 类型的对象并将其嵌入到 LambdaExpression 中:

var filter = new FilterObject();
// create Expression<Func<MyObject, bool>> lambda = x => GetConjunctionResult(
// x.PersonA.IsSomething, x.PersonB.IsSomething, filter.ConjunctionType));

现在可能有更好的方法来做到这一点,所以我愿意接受任何完全避免这种方法的建议。

最佳答案

给定

var filter = new FilterObject()

应该是:

Expression<Func<MyObject, bool>> exp2 = 
Expression.Lambda<Func<MyObject, bool>>(
Expression.Invoke(myExp,
myExp.Parameters[0],
Expression.Constant(filter)),
myExp.Parameters[0]);

Expression.Invoke 将调用另一个表达式并将新表达式的第一个参数作为第一个参数传递,并将 Expression.Constant 作为第二个参数传递给您过滤器。

您是否尝试对表达式树使用柯里化(Currying)?

关于c# - 减少 LambdaExpression 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18236494/

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