Как проверить равенство выражений

Возможный дубликат:
Самый эффективный способ проверить равенство лямбда-выражений
Как проверить, совпадают ли два выражения>;

Как проверить, что два выражения совпадают с этим примером

        string firstname = "Ahmed";
        Expression<Func<string, bool>> exp1 = (s) => s.Contains(firstname);
        Expression<Func<string, bool>> exp2 = (s) => s.Contains(firstname);

        Console.WriteLine(exp1 == exp2);//print false as two references are no equal

Теперь, как обеспечить, чтобы выражение1 равнялось выражению2, поскольку они имеют одинаковые критерии?

2 ответа

Решение

Вот код для ExpressionEqualityComparer который может показать, как это сделать.

https://source.db4o.com/db4o/trunk/db4o.net/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/

Если вы хотите проверить, равны ли выражения, а не только то, что они всегда вычисляются одинаково, вы можете сделать это:

exp1.ToString() == exp2.ToString()

Обратите внимание, что даже незначительные изменения приведут к тому, что это вернет false, как, например, j => j.Contains(firstname) или используя exp2 из этого класса:

public class Test
{
    static string firstname;
    public static Expression<Func<string, bool>> exp2 = s => s.Contains(firstname);
}

(хотя лямбды выглядят одинаково в коде, ToStringпоказывает, что кто-то использует Test.firstname а другой использует сгенерированный компилятором класс firstname)

Тем не менее, это может быть полезно в зависимости от того, откуда приходят ваши выражения.

Другие вопросы по тегам