C#如何将两个表达式组合成一个新表达式

本文关键字:表达式 一个 组合 两个 | 更新日期: 2023-09-27 18:20:05

我有两个表达式:

public static Expression<Func<int, bool>> IsDivisibleByFive() {
   return (x) => x % 5 == 0;
}

public static Expression<Func<int, bool>> StartsWithOne() {
   return (x) => x.ToString().StartsWith("1");
}

我想创建一个同时应用这两个表达式的新表达式(相同的表达式以不同的组合在我的代码中使用):

public static Expression<Func<int, bool>> IsValidExpression() {
   return (x) => IsDivisibleByFive(x) && StartsWithOne(x);
}

然后执行:

public static class IntegerExtensions
{
    public static bool IsValid(this int self) 
    {
        return IsValidExpression().Compile()(self);
    }
}

在我的代码中:

if (32.IsValid()) {
   //do something
}

我有很多这样的表达式,我想定义一次,而不是到处重复代码。

谢谢。

C#如何将两个表达式组合成一个新表达式

如果您只是尝试将表达式体与AndAlso表达式组合,则会遇到的问题是x参数表达式实际上是两个不同的参数(即使它们具有相同的名称)。为了做到这一点,您需要使用一个表达式树访问者来将要组合的两个表达式中的x替换为一个通用的ParameterExpression

你可能想看看Joe Albahari的PredicateBuilder库,它为你做了繁重的工作。结果应该看起来像:

public static Expression<Func<int, bool>> IsValidExpression() {
   return IsDivisibleByFive().And(StartsWithOne());
}