您可以看一下Linq to db4o内部使用的类型ExpressionEqualityComparer。它实现了IEqualityComparer
它使用ExpressionComparison类型比较两个Expression是否相等,并使用HashCodeCalculation来根据Expression计算哈希码。
所有这些都涉及访问表达式树,因此,如果您反复进行操作,可能会花费很多,但也很方便。
例如,这是您的测试:
using System;
using System.Linq.Expressions;
using Db4objects.Db4o.Linq.Expressions;
class Test {
static void Main ()
{
Expression<Func<int, bool>> a = x => false;
Expression<Func<int, bool>> b = x => false;
Expression<Func<int, bool>> c = x => true;
Expression<Func<int, bool>> d = x => x == 5;
Func<Expression, Expression, bool> eq =
ExpressionEqualityComparer.Instance.Equals;
Console.WriteLine (eq (a, b));
Console.WriteLine (eq (a, c));
Console.WriteLine (eq (a, d));
}
}
它确实会打印True,False,False。