C # как объединить два выражения в новое? - PullRequest
2 голосов
/ 12 января 2012

У меня есть два выражения:

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 Ответ

6 голосов
/ 12 января 2012

Проблема, с которой вы столкнетесь, если попытаетесь объединить тела выражений с выражением AndAlso, состоит в том, что выражения параметров x на самом деле представляют собой два разных параметра (даже если они имеют одно и то же имя). Чтобы сделать это, вам нужно использовать посетитель дерева выражений, чтобы заменить x в двух выражениях, которые вы хотите объединить с одним общим ParameterExpression.

Возможно, вы захотите взглянуть на библиотеку Джо Албахари PredicateBuilder , которая делает тяжелую работу за вас. Результат должен выглядеть примерно так:

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