首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何检查两个Expression <Func <T,bool >>是否相同

要检查两个Expression <Func <T,bool >>是否相同,可以使用以下方法:

  1. 将两个Expression <Func <T,bool >>转换为字符串表示形式,然后比较字符串是否相同。
  2. 使用ExpressionVisitor类来递归地比较两个Expression <Func <T,bool >>的节点是否相同。
  3. 使用ExpressionEqualityComparer类来比较两个Expression <Func <T,bool >>是否相同。

以下是示例代码:

代码语言:csharp
复制

public static bool AreExpressionsEqual<T>(Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)

{

代码语言:txt
复制
// 方法1:将两个Expression <Func <T,bool >>转换为字符串表示形式,然后比较字符串是否相同。
代码语言:txt
复制
string str1 = expr1.ToString();
代码语言:txt
复制
string str2 = expr2.ToString();
代码语言:txt
复制
if (str1 == str2)
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
// 方法2:使用ExpressionVisitor类来递归地比较两个Expression <Func <T,bool >>的节点是否相同。
代码语言:txt
复制
ExpressionEqualityVisitor visitor = new ExpressionEqualityVisitor();
代码语言:txt
复制
if (visitor.Equals(expr1, expr2))
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
// 方法3:使用ExpressionEqualityComparer类来比较两个Expression <Func <T,bool >>是否相同。
代码语言:txt
复制
ExpressionEqualityComparer comparer = new ExpressionEqualityComparer();
代码语言:txt
复制
if (comparer.Equals(expr1, expr2))
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
return false;

}

public class ExpressionEqualityVisitor : ExpressionVisitor

{

代码语言:txt
复制
private readonly Stack<Expression> _expressions = new Stack<Expression>();
代码语言:txt
复制
public bool Equals(Expression x, Expression y)
代码语言:txt
复制
{
代码语言:txt
复制
    _expressions.Clear();
代码语言:txt
复制
    _expressions.Push(x);
代码语言:txt
复制
    _expressions.Push(y);
代码语言:txt
复制
    return Visit(x, y);
代码语言:txt
复制
}
代码语言:txt
复制
protected override bool Visit(Expression x, Expression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (x == null && y == null)
代码语言:txt
复制
    {
代码语言:txt
复制
        return true;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (x == null || y == null || x.NodeType != y.NodeType || x.Type != y.Type)
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    switch (x.NodeType)
代码语言:txt
复制
    {
代码语言:txt
复制
        case ExpressionType.Negate:
代码语言:txt
复制
        case ExpressionType.NegateChecked:
代码语言:txt
复制
        case ExpressionType.Not:
代码语言:txt
复制
        case ExpressionType.Convert:
代码语言:txt
复制
        case ExpressionType.ConvertChecked:
代码语言:txt
复制
        case ExpressionType.ArrayLength:
代码语言:txt
复制
        case ExpressionType.Quote:
代码语言:txt
复制
        case ExpressionType.TypeAs:
代码语言:txt
复制
        case ExpressionType.UnaryPlus:
代码语言:txt
复制
            return VisitUnary((UnaryExpression)x, (UnaryExpression)y);
代码语言:txt
复制
        case ExpressionType.Add:
代码语言:txt
复制
        case ExpressionType.AddChecked:
代码语言:txt
复制
        case ExpressionType.Subtract:
代码语言:txt
复制
        case ExpressionType.SubtractChecked:
代码语言:txt
复制
        case ExpressionType.Multiply:
代码语言:txt
复制
        case ExpressionType.MultiplyChecked:
代码语言:txt
复制
        case ExpressionType.Divide:
代码语言:txt
复制
        case ExpressionType.Modulo:
代码语言:txt
复制
        case ExpressionType.And:
代码语言:txt
复制
        case ExpressionType.AndAlso:
代码语言:txt
复制
        case ExpressionType.Or:
代码语言:txt
复制
        case ExpressionType.OrElse:
代码语言:txt
复制
        case ExpressionType.LessThan:
代码语言:txt
复制
        case ExpressionType.LessThanOrEqual:
代码语言:txt
复制
        case ExpressionType.GreaterThan:
代码语言:txt
复制
        case ExpressionType.GreaterThanOrEqual:
代码语言:txt
复制
        case ExpressionType.Equal:
代码语言:txt
复制
        case ExpressionType.NotEqual:
代码语言:txt
复制
        case ExpressionType.Coalesce:
代码语言:txt
复制
        case ExpressionType.ArrayIndex:
代码语言:txt
复制
        case ExpressionType.RightShift:
代码语言:txt
复制
        case ExpressionType.LeftShift:
代码语言:txt
复制
        case ExpressionType.ExclusiveOr:
代码语言:txt
复制
            return VisitBinary((BinaryExpression)x, (BinaryExpression)y);
代码语言:txt
复制
        case ExpressionType.TypeIs:
代码语言:txt
复制
            return VisitTypeIs((TypeBinaryExpression)x, (TypeBinaryExpression)y);
代码语言:txt
复制
        case ExpressionType.Conditional:
代码语言:txt
复制
            return VisitConditional((ConditionalExpression)x, (ConditionalExpression)y);
代码语言:txt
复制
        case ExpressionType.Constant:
代码语言:txt
复制
            return VisitConstant((ConstantExpression)x, (ConstantExpression)y);
代码语言:txt
复制
        case ExpressionType.Parameter:
代码语言:txt
复制
            return VisitParameter((ParameterExpression)x, (ParameterExpression)y);
代码语言:txt
复制
        case ExpressionType.MemberAccess:
代码语言:txt
复制
            return VisitMemberAccess((MemberExpression)x, (MemberExpression)y);
代码语言:txt
复制
        case ExpressionType.Call:
代码语言:txt
复制
            return VisitMethodCall((MethodCallExpression)x, (MethodCallExpression)y);
代码语言:txt
复制
        case ExpressionType.Lambda:
代码语言:txt
复制
            return VisitLambda((LambdaExpression)x, (LambdaExpression)y);
代码语言:txt
复制
        case ExpressionType.New:
代码语言:txt
复制
            return VisitNew((NewExpression)x, (NewExpression)y);
代码语言:txt
复制
        case ExpressionType.MemberInit:
代码语言:txt
复制
            return VisitMemberInit((MemberInitExpression)x, (MemberInitExpression)y);
代码语言:txt
复制
        case ExpressionType.ListInit:
代码语言:txt
复制
            return VisitListInit((ListInitExpression)x, (ListInitExpression)y);
代码语言:txt
复制
        case ExpressionType.NewArrayInit:
代码语言:txt
复制
        case ExpressionType.NewArrayBounds:
代码语言:txt
复制
            return VisitNewArray((NewArrayExpression)x, (NewArrayExpression)y);
代码语言:txt
复制
        case ExpressionType.Invoke:
代码语言:txt
复制
            return VisitInvocation((InvocationExpression)x, (InvocationExpression)y);
代码语言:txt
复制
        case ExpressionType.Index:
代码语言:txt
复制
            return VisitIndex((IndexExpression)x, (IndexExpression)y);
代码语言:txt
复制
        case ExpressionType.Extension:
代码语言:txt
复制
            return VisitExtension(x, y);
代码语言:txt
复制
        default:
代码语言:txt
复制
            throw new NotSupportedException(string.Format("Unhandled expression type: '{0}'", x.NodeType));
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
protected override Expression VisitBinary(BinaryExpression x, BinaryExpression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (!Equals(x.Method, y.Method))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.Left, y.Left))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.Right, y.Right))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
protected override Expression VisitConditional(ConditionalExpression x, ConditionalExpression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (!Visit(x.Test, y.Test))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.IfTrue, y.IfTrue))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【c#表达式树】最完善的表达式树Expression.Dynamic的玩法

    在我第一次写博客的时候,写的第一篇文章,就是关于表达式树的,链接:https://www.cnblogs.com/1996-Chinese-Chen/p/14987967.html,其中,当时一直没有研究Expression.Dynamic的使用方法(因为网上找不到资料),就了解到是程序运行时动态去构建表达式树,举个例子,例如我们需要在我们的查询条件中去构建他是等于或者不等于,这个时候,虽然我们可以定义等于或者不定于 的BinaryExpression,然后在代码中通过switch去进行判断,使用的是Equal还是NotEqual,这中间还需要我们自己去写一个switch,如果使用了Dynamic的方法,我们就只需要找到对应的ExpressionType然后传入创建Binder的方法中,在调用Dynamic方法就可以动态的实现,各种判断操作,或者其他的调用方法,灵活度比switch更高,接下来,我们就看看如何使用Expression.Dynamic方法来实现各种操作吧,一下所有代码操作需要引入Microsoft.CSharp.RuntimeBinder,nuget搜索Microsoft.CSharp即可。方便测试,我新建了一个Test的类,下面会用到

    01

    C# 最完善的表达式树 Expression.Dynamic的玩法

    在我第一次写博客的时候,写的第一篇文章,就是关于表达式树。其中当时一直没有研究Expression.Dynamic的使用方法(因为网上找不到资料),就了解到是程序运行时动态去构建表达式树,举个例子,例如我们需要在我们的查询条件中去构建他是等于或者不等于,这个时候,虽然我们可以定义等于或者不定于 的BinaryExpression,然后在代码中通过switch去进行判断,使用的是Equal还是NotEqual,这中间还需要我们自己去写一个switch,如果使用了Dynamic的方法,我们就只需要找到对应的ExpressionType然后传入创建Binder的方法中,在调用Dynamic方法就可以动态的实现,各种判断操作,或者其他的调用方法,灵活度比switch更高,接下来,我们就看看如何使用Expression.Dynamic方法来实现各种操作吧,一下所有代码操作需要引入Microsoft.CSharp.RuntimeBinder,nuget搜索Microsoft.CSharp即可。

    03
    领券