Нет готового способа сделать это.Наиболее близким является метод Expression.Reduce()
, который не делает нужного вам сокращения.
Вам потребуется написать синтаксический анализатор выражений, который упрощает, скажем, логические выражения, а затем некоторыелогика для проверки того, что упрощенные выражения одинаковы.
Пример класса (без проверки, просто рамки получения выражений в:
public class ExpressionTest {
public bool AreExpressionsSame<T>(Expression<T>/*<Func<bool,bool,bool>>*/ expr1, Expression<T> expr2) {
var expr1_reduced = expr1.Reduce();
var expr2_reduced = expr2.Reduce();
//at this point expr2_reduced is the same as it went it.
return true;
}
public void AreExpressionSameShouldAcceptLambda() {
ExpressionTest et = new ExpressionTest();
et.AreExpressionsSame<Func<bool,bool,bool>>((a,b) => a || b, (a,b)=>a && b || b);
}
}