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

时间:2012-01-12 19:19:44

标签: c# linq lambda expression

我有两个表达方式:

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
}

我有很多这样的表达式,我想要定义一次,而不是在整个地方复制代码。

感谢。

1 个答案:

答案 0 :(得分:6)

如果您尝试将表达式主体与AndAlso表达式结合使用,您将遇到的问题是x参数表达式实际上是两个不同的参数(即使它们具有相同的名称) 。为此,您需要使用表达式树访问者来替换要与单个公共x组合的两个表达式中的ParameterExpression

您可能需要查看Joe Albahari's PredicateBuilder library,这对您来说非常重要。结果应该类似于:

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